MFC|MFC 循环界面假死的解决(MFC 按钮终止循环)

有两种方法:
1. 单线程解决:
OnBtn1()
{
while(m_bLoop)
{
your code....

// 派发消息
MSG msg;
if (PeekMessage(&msg,(HWND)NULL, 0, 0, PM_REMOVE))
{
::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
}
}

OnBtn2()
{
m_bLoop = FALSE;
}
2. 多线程 (参考:http://www.vckbase.com/document/viewdoc/?id=1704)
a. 在xxxDlg.h中类的外面(即大括号外面)定义一个函数 void ThreadFunc(); (外部函数)
b. 在xxxDlg类中定义在类CMultiThread1Dlg内部添加protected型变量:
HANDLE hThread; DWORD ThreadID;
分别代表线程的句柄和ID。
c. 在xxxDlg.cpp中定义全局变量volatileBOOL m_Flag;
d.在xxxDlg.cpp中写ThreadFunc函数
void ThreadFunc()
{
while(m_Flag)
{
//your code here
}
return; //线程自杀
}
e. 按钮A代表开始循环

void CxxxDlg::OnStart()

{
hThread=CreateThread(
NULL,
0, (LPTHREAD_START_ROUTINE)ThreadFunc, NULL, 0,
&ThreadID
);
}
f. 按钮B代表结束循环

void CxxxDlg::OnStop() { m_bRun=FALSE; }

其他解决方法:
方法<1> :
把开始按钮中的那些循环部分单独写成一个子线程,在按钮的处理函数中产生子线程,主线程就不会因为循环而阻塞消息了.

#7楼 回复于:2007-05-09 18:15:50
看一下有关线程的东西就ok啦,无非就是把循环放在另外开辟的子线程中,你那样是在主线程中运行,所以造成界面假死现象,因为主线程被阻塞而忙于处理你的循环,所以就顾不上响应你的其他操作了

#8楼 回复于:2007-05-09 18:24:12
dowhile循环中,加入这句sleep(10).

死循环放线程中,这样UI线程不会阻塞,界面就不会假死了
死循环中可以不断的PostMessage等发送消息给UI线程,来更新界面,如进度条等都是这么个流程

冬去春来回复于06日13点48分 //可以将以下代码放到循环中,就可以处理消息了,但最好还是使用线程:

while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SLEEP是暂停了当前你主线程,会暂停消息响应,所以出现假死状态,可以抛出另一个线程,再到那个线程里面sleep,这样主线程就不会被暂停了


【MFC|MFC 循环界面假死的解决(MFC 按钮终止循环)】转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3089947.html

    推荐阅读