如何正确的关闭 MFC 线程

前言:多线程

  近日在网上看到不少人问及如何关闭一下线程,可是我看网上给出的并不详细,并且有些方法仍是错误的。小弟在此拙做一篇,不谈别的,只谈及如何正确的关闭MFC的线程,至于Win32和C RunTime的线程暂不涉及。函数

一.关于MFC的线程oop

  1.MFC的线程有两种,一种称为Work线程,一种称为UI线程。通常状况下Work线程与UI线程的区别主要在于UI线程有消息队列(并非有没有界面,这点要注意,UI线程也是能够没有界面的)。ui

  2.建立这两种线程的区别也不大,能够从建立函数看出。线程

关于函数的具体使用,请查阅MSDN,这里不涉及。设计

二. 结束线程前的注意事项对象

  在结束一个线程前,只有一点要注意,那就是m_bAutoDelete 的状态。(什么?不知道m_bAutoDelete ?!!快去查阅MSDN吧)。队列

m_bAutoDelete = TRUE; 系统本身清理CWind对象,固然还包括CloseHandle(),ExitInstance()等等一堆函数的调用。内存

m_bAutoDelete = FALSE; 那么就必定要记得本身在用完后调用delete删除建立线程的对象,这一点极为重要,由于不调用delete必定会有内存泄漏问题。消息队列

总之m_bAutoDelete 的值对结束工做是很重要的,这点必定要注意。

三.正确的结束一个Work线程

  由于Work线程是一个全局函数,或者是一个Static函数,因此它的运行完成也就是它的正常退出了。(什么?不明白,示例代码以下)

  1.状况一:

  2.状况二:

Work线程是个死循环或一时半会儿出不来,这时要主线程要发个消息给Work线程,让他退出。

关于主线程发一个激发态的消息给Work线程,有多种方法,如在主线程里调用SetEvent()等等,你想用什么都行,可是最好不要在Work线程里用Busy loop的方法。至于为何,请参阅《Win32多线程程序设计》上面的论述。

四.正确结束一个UI线程

  由于UI线程有消息队列,因此结束一个UI线程最好的方法是发一个WM_QUIT消息给消息队列,方法不少如:PostQuitMessage(),PostThreadMessage()等等。可是发出消息后最好等待看UI线程是否已经退出(不少人都没有说起这一点,可是实际工做中发现,加上这一点是多么的重要)。

五.关于几个问题的解答

1.问:为何个人UI线程没有调用ExitInstance()?

  答:最大的多是你的WM_QUIT消息没有通知到UI线程。为了保险期间最好调用PostThreadMessage(),这样能够指定线程的ID。固然若是你对消息比较熟悉的话,也能够抛一个消息到最顶层。

2.问:为何个人UI线程没有调用析构函数?

  答:检查看你的m_bAutoDelete = FALSE,若是是的话,那么看你的线程对象是否已经delete了。通常状况下调用delete会调用析构函数。

3.问:在UI线程中没有调用WaitForSingleObject(),会怎么样?

  答:咱们知道在PostMessage()以后,函数会立刻返回,如查没有wait...(),那么紧接着就调用了delete,颇有可能对象作的退出操做过程尚未完成时,又把对象delete掉了,结果仍是没有正常结束。(注:WM_QUIT消息以后会触发一堆函数,这个时间是不定的,因此最好Wait...才是正道。)

六.最后不肯提的函数

  几乎每本讲线程的书都会提到下面的函数:

  void AfxEndThread(UINT nExitCode);

  TerminateThread();

  ......还有其它的一些极端的函数

个人观点是:最好不要使用,除非你知道要发生什么!!

相关文章
相关标签/搜索