如何正确的关闭 MFC 线程
2015-01-06 16:17
525 查看
一.关于MFC的线程
1.MFC的线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列。 2.创建这两种线程的区别也不大,可以从创建函数看出。 // Work线程 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); // UI线程 CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); 二. 结束线程前的注意事项 在结束一个线程前,只有一点要注意,那就是m_bAutoDelete 的状态。 m_bAutoDelete = FALSE; // 表示你自己管理 CWind 对象,包括它的清理 m_bAutoDelete = TRUE; // 默认值, 系统会自己清理 CWind 对象 m_bAutoDelete = TRUE; 系统自己清理CWind对象,当然还包括CloseHandle(),ExitInstance()等等一堆函数的调用。 m_bAutoDelete = FALSE; 那么就一定要记得自己在用完后调用delete删除创建线程的对象,这一点极为重要,因为不调用delete一定会有内存泄漏问题。 总之m_bAutoDelete 的值对结束工作是很重要的,这点一定要注意。 三.正确的结束一个Work线程 因为Work线程是一个全局函数,或者是一个Static函数,所以它的运行完成也就是它的正常退出了。 1.情况一: UINT WorkFunc(LPVOID pParam) { // 工作 ...... return 0; // 就算正常退出了,简单吧 } 2.情况二: Work线程是个死循环或一时半会儿出不来,这时要主线程要发个消息给Work线程,让他退出。 UINT WorkFunc(LPVOID pParam) { for(;;) { // ... if( WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, INFINITE)} // 收到激发态的消息 { return 0;//正常退出 } }//end for return 0; } 关于主线程发一个激发态的消息给Work线程,有多种方法,如在主线程里调用SetEvent()等等,你想用什么都行,但是最好不要在Work线程里用Busy loop的方法。至于为什么,请参阅《Win32多线程程序设计》上面的论述。 四.正确结束一个UI线程 因为UI线程有消息队列,所以结束一个UI线程最好的方法是发一个WM_QUIT消息给消息队列,方法很多如:PostQuitMessage(),PostThreadMessage()等等。但是发出消息后最好等待看UI线程是否已经退出(很多人都没有提及这一点,但是实际工作中发现,加上这一点是多么的重要)。 // 主线程结束UI线程的代码 if(pThread) { // 1. 发一个WM_QUIT 消息结 UI 线程 pThread->PostThreadMessage(WM_QUIT, NULL, NULL); // 2. 等待 UI 线程正常退出 if (WAIT_OBJECT_0 == WaitForSingleObject(pThread->m_hThread, INFINITE)) { // 3. 删除 UI 线程对象,只有当你设置了m_bAutoDelete = FALSE; 时才调用 delete pThread; } }
相关文章推荐
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭MFC线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- 如何正确的关闭 MFC 线程
- java多线程开发 如何正确关闭线程
- MFC中如何安全的创建和关闭线程
- 如何正确的关闭socket (linux)
- 在 Windows 7 下如何使用 native c++ 正确创建线程
- 关于MFC中工作线程如何正常退出
- 如何正确关闭linux