欢迎光临~湖南智能应用科技有限公司-hniat.com
语言选择: 中文版 ∷  英文版

基础知识

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
do   while循环中,加入这句sleep(10).

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

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

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

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3089947.html

关闭
用手机扫描二维码关闭
二维码