Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 关于线程的终止问题
【标  题】:关于线程的终止问题
【关键字】:
【来  源】:http://blog.csdn.net/virtualxmars/archive/2007/02/25/1513812.aspx

关于线程的终止问题

Your Ad Here

在开发的时候,发现线程没有真正的终止,一直在吃CPU,仔细分析,做了个测试程序,发现问题如下
1.从CWinThread派生了自己的CMyThread类,并且,这是一个UI线程(其实这个影响不大,在其他人的文章里也提过,任何线程都能处理消息,只是UI线程会有一个隐藏起来的窗口。)
  1.1重载InitInstance函数
         BOOL CMyThread::InitInstance()
         {
            TRACE( "CMyThread::InitInstance\n");
            this->Run();
            return TRUE;
         }
  1.2重载ExitInstance函数
         int CMyThread::ExitInstance()
         {
            TRACE("CMyThread::ExitInstance\n");
             ::Sleep(500);
             return CWinThread::ExitInstance();
         }
  1.3在Dialog的Button事件里启动线程
           m_pThread = ::AfxBeginThread( RUNTIME_CLASS(CMyThread ),THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED );
            ASSERT ( m_pThread );

          m_pThread->m_bAutoDelete = FALSE;
            m_pThread->ResumeThread();

  1.4在Stop事件中终止线程
            m_pThread->PostThreadMessage( WM_QUIT, NULL, NULL );
            ::WaitForSingleObject( m_pThread->m_hThread, INFINITE );

            delete m_pThread;
            m_pThread = NULL;
            TRACE("______Oh~How hard I reach it\n");

程序运行的调试信息如下:
       CMyThread::InitInstance
       CMyThread::ExitInstance


问题如下
    个人感觉这应该是属于消息循环处理不当的问题,我曾试过不调用Run()进入消息循环(当然也不Post WM_QUIT了),线程是会主动结束的,也就是说,会有以下调试信息输出:
            ______Oh~How hard I reach it

    但是如果使用Run()来处理消息循环,就始终得不到该调试信息。其问题应该是由于线程没有真正结束。线程句柄(m_hThread)没有被激发,所以WaitForSingleObject一直处于等待当中。

    于是,真正的问题出来了。我确实向该线程序发送了WM_QUIT消息,并且,Run()也接收到消息,终止了消息循环,进入到ExitInstance函数中了(参看调试输出信息)。这样来说,消息循环应该是终止了才对的。那么,和不调用Run()结束了有区别么,因为已经从Run返回了啊。那么又是什么导致线程没有结束呢?

从字符串编程谈计算机底层知识:【上一篇】
Item 35. Memory Management part 1:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • Linux 指令篇:字串处理--tr
  • [转贴]八十句话
  • 在Windows下手动安装MinGW与Blitz++
  • Liferay 的 Javascript 函数类——Portlet
  • BLP Ch1:Linux编程基本知识
  • Jsp&Servelet 学习笔记-第一个jsp程序介绍
  • Windows Vista不兼容VS2005(需打补丁)
  • 用Traceroute确定路径MTU
  • 将ado方便的转化为XML文件
  • 关于exit()与return()的用法与区别
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.