记录下来只是为了告诉自己
线程兄弟:
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个链接的博主文章 受益匪浅 在此感谢!