有两种方法:
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. 多线程 (参考:)
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:12do while循环中,加入这句sleep(10). 死循环放线程中,这样UI线程不会阻塞,界面就不会假死了 死循环中可以不断的PostMessage等发送消息给UI线程,来更新界面,如进度条等都是这么个流程 冬去春来回复于06日13点48分 //可以将以下代码放到循环中,就可以处理消息了,但最好还是使用线程: while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } |
SLEEP是暂停了当前你主线程,会暂停消息响应,所以出现假死状态,可以抛出另一个线程,再到那个线程里面sleep,这样主线程就不会被暂停了