MFC关闭窗口时针对正在运行的线程如何处理

    xiaoxiao2022-07-06  163

    记录下来只是为了告诉自己

     

    线程兄弟:

        for(;;){

            // 非激情阶段

            // 如火如荼的激情阶段

            // 非激情阶段  

        }

     

    这时候如果关闭整个对话框,可能会出现程序崩溃问题。

     

    原因在于线程中的兄弟正在如火如荼的搞事情(激情中..不能被打断状态),你突然下令"关闭一切"的命令,此时线程兄弟是不会听你的命令的,如果强行被你命令,他们只有鱼死网破,最终导致程序崩溃。

    此时及时你非常想"关闭一切",也需要以商量的语气跟线程兄弟说:"知道您忙,但是大家都很忙的.. 您看您忙完激情这一块,咱先休息休息好呗.. "

    好在这位线程兄弟吃软不吃硬.. 他同意了你的请求(忙完激情片段后休息)。

    这样你作为"老大",虽然稍稍完了几毫秒,但程序自然而又正常的关闭了。

     

    下面开始讲述实现过程伪代码(其实方法有很多,在这里只是说一种我觉得还不错的):

    1. 创建CEvent m_Event; 

    2.

        for(;;){

            // 非激情阶段

            m_Event.ResetEvent();

            // 如火如荼的激情阶段

             m_Event.SetEvent();

        if (PeekMessage(&m_Message_Evaluate, NULL, 0, 0, PM_REMOVE)) {         if (m_Message_Evaluate.message == WM_QUIT) {

                TranslateMessage(&m_Message_Evaluate);             DispatchMessage(&m_Message_Evaluate);             return;         }     }

            // 非激情阶段  

        }

     

    3.

    在 ::OnClose() ( ::OnDestroy() 或 其他关闭时调用的api 应该也可以 待测试)     if (m_pThread) {         MsgWaitForMultipleObjects(1, &(m_pThread->m_hThread), false, INFINITE, QS_ALLINPUT);         ::PostThreadMessage(m_pThread->m_nThreadID, WM_QUIT, 0, 0);     }

     

    这样就皆大欢喜的完成了"关闭一切"的工作。

    本人参考下面2个链接的博主文章 受益匪浅 在此感谢!

    https://blog.csdn.net/u011519892/article/details/19407311

    https://blog.csdn.net/silvervi/article/details/5874212

    最新回复(0)