博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC 循环界面假死的解决(MFC 按钮终止循环)
阅读量:5231 次
发布时间:2019-06-14

本文共 1327 字,大约阅读时间需要 4 分钟。

有两种方法:

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: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

你可能感兴趣的文章
javascript高级程序设计--笔记01
查看>>
[LeetCode]621. Task Scheduler 任务安排 题解
查看>>
Lua
查看>>
页面布局方案-左定宽,右自适应
查看>>
jQuery源码分析之extend方法
查看>>
OO第一次博客作业
查看>>
iOS - 图片模糊效果实现
查看>>
常用的第三方模块 requests url
查看>>
揭开Altera公司支持OpenCL的设计工具的神秘面纱
查看>>
开发邮件html的几个注意点
查看>>
BZOJ1027 [JSOI2007]合金
查看>>
传送门
查看>>
COMP9334 Project
查看>>
C#获取数组大小
查看>>
Oracle 错误
查看>>
【Linux】Mutex互斥量线程同步的例子
查看>>
Day 2 上午
查看>>
[leetcode] 380. Insert Delete GetRandom O(1)
查看>>
Linux下打包压缩成war包和解压war包
查看>>
[More Effective C++ 学习笔记]异常
查看>>