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

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

 

线程兄弟:

    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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值