利用C++以MFC为平台写的软件自动崩溃,界面卡死,不响应任何操作

yy1124 2015-06-19 05:25:36
请教:我写了个软件,利用VS的MFC平台,在debug下运行,有时会出现界面卡死的现象,不会响应任何动作,只能按停止调试来结束程序,按暂停指示指在Sleep(1);这句上,请问有人知道问题出哪了吗?
...全文
667 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-04
  • 打赏
  • 举报
回复
Windows系统:“不要调用我,请先填写好未来收到某个消息时你的处理流程,在那个消息到来时我会调用你!”
0dawn 2015-11-04
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
在循环中加入消息循环:
        MSG msg;
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
赵4老师为什么我在控制进度条的时候setpos不起作用,加入这个循环后就OK了呢?
yy1124 2015-08-20
  • 打赏
  • 举报
回复
是属性里配置错了,多了个下划线,去掉就好了。
笨笨仔 2015-06-21
  • 打赏
  • 举报
回复
引用 楼主 u014633893 的回复:
请教:我写了个软件,利用VS的MFC平台,在debug下运行,有时会出现界面卡死的现象,不会响应任何动作,只能按停止调试来结束程序,按暂停指示指在Sleep(1);这句上,请问有人知道问题出哪了吗?
先加大Sleep值试试吧,比如用Sleep(10)或Sleep(20)
turbo_casey 2015-06-20
  • 打赏
  • 举报
回复
		// 代码片段,i 累加到一定程度退出		
		MSG		msg;
		int 		i = 0 ;

		
		while (TRUE) {        
			if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {        
				if (msg.message == WM_QUIT)     
					break ;        
				
				TranslateMessage (&msg) ;        
				DispatchMessage (&msg) ;        
			} else {      
				//  做你想做的事情
				// 但是千万不能Sleep 长时间哦
				//  这里的处理时间也要很短,因为和上面的消息loop 是串行处理
				//  但是可以连续的处理,比如 i ++ 
				if (i ++ < 0xfffffffUL) 
					break;
			}       
		}       
		
		if (msg.message == WM_QUIT)		
			pdlg->extCancle ();	// 这里处理退出的消息
turbo_casey 2015-06-20
  • 打赏
  • 举报
回复
你代码里面有 sleep 么,UI 线程中不能while (1) ,不能SLEEP 很长时间,那样会阻塞消息循环,如果你确实需要在UI线程里执行 while (1) 这类的 busy loop ,可以自己构建一个 消息循环,保证消息畅通,代码如下:
CProgressCtrl		progress ;
		int					total_len = mci.getlen ();
		int					cur_pos = 0;
		
		progress.Create (WS_CHILD,rect,&pdlg->m_ItemList,0x9900);
		progress.SetRange32 (0,total_len);
		progress.ShowWindow (SW_SHOW);
		
		MSG		msg;
		while (TRUE) {        
			if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {        
				if (msg.message == WM_QUIT)     
					break ;        
				
				TranslateMessage (&msg) ;        
				DispatchMessage (&msg) ;        
			} else {      
				// do what you want 

				cur_pos = mci.getpos ();
				
				if (cur_pos >= total_len)
					break;
				else
					progress.SetPos (cur_pos);
			}       
		}       
		
		mci.stop ();
		mci.close ();
		
		if (msg.message == WM_QUIT)		
			pdlg->extCancle ();
zyw067 2015-06-20
  • 打赏
  • 举报
回复
楼上们解答好详细,谢谢
mfmfmmf1 2015-06-20
  • 打赏
  • 举报
回复
目测楼主把sleep(1)写在了 OnMouseMove一类的函数里了 这跟写在while(1)里一个效果
worldy 2015-06-20
  • 打赏
  • 举报
回复
Sleep(1)怎么可能会有问题,lz最后把Sleep(1)所在的代码发出来看看
lx624909677 2015-06-20
  • 打赏
  • 举报
回复
sleep或者死循环之类的代码, 起一个线程来写,不要放在主线程里做这些事情,不然的话界面就会卡死
赵4老师 2015-06-19
  • 打赏
  • 举报
回复
在循环中加入消息循环:
        MSG msg;
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
zgl7903 2015-06-19
  • 打赏
  • 举报
回复
是不是消息响应中有死循环或长时间的处理? 启动后台线程处理耗时的过程 或者是定时器加状态机模式处理
mfmfmmf1 2015-06-19
  • 打赏
  • 举报
回复
你的代码里有::Sleep(1); ? 换release运行就不出问题吗?

16,372

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧