一个看似简单却迷惑的问题。

小小爬虾 2013-03-09 02:29:25
各位,我编写了个测试while循环的小程序,代码如下
void CTest_WhileDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
int i=1;
while (i<10000)
{
i=i+1;
Sleep(100);
}
}

产生exe运行后,在任务管理器中查看,就是无响应了,把鼠标移至应用程序的界面上,鼠标呈现漏斗状(忙碌中),而且产生了两个应用程序(我只开了一个exe且只点了一下TEST),如图:

请问各位,这是什么原因呢?这样属于死循环的范畴吗?怎样才能避免呢?
...全文
359 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-03-11
  • 打赏
  • 举报
回复
void CTest_WhileDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    int i=1;
    MSG msg;
    while (i<10000)
    {
        i=i+1;
        Sleep(100);
        if (0==i%10)
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}
mujiok2003 2013-03-10
  • 打赏
  • 举报
回复
引用 9 楼 kxltsuperr 的回复:
那到底该如何写这段代码,请明示吧..................................
希望都是明示,没有暗示

//只是一个简单fix, 自己改进
bool shutdown = false;
unsigned int __stdcall ThreadFun(PVOID pM)
{
  int i=1;
  while (!shutdown && i<10000)
  {
    i=i+1;
    Sleep(100);
  }
  AfxMessageBox("执行完毕");
  return 0;
}
void CTest_WhileDlg::OnButton1() 
{
  HANDLE handle=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,NULL);
  CloseHandle(handle); //不要等待,也不要循环,只是简单的调度一下
}
//新加一个按钮,在关闭程序前, 关闭子线程
void CTest_WhileDlg::OnButton2() 
{
  shutdown = true;
}
小小爬虾 2013-03-10
  • 打赏
  • 举报
回复
引用 8 楼 mujiok2003 的回复:
引用 7 楼 kxltsuperr 的回复:我改了一下代码,创建了一个新的子线程执行代码,为什么还是有问题,未响应呢? C/C++ code?1WaitForSingleObject(handle,INFINITE); //这里还是相当于循环,变了一个形式而已
................................ 对啊!我只是想着在代码另外一个线程里运行了。 那到底该如何写这段代码,请明示吧..................................
小小爬虾 2013-03-10
  • 打赏
  • 举报
回复
引用 13 楼 lc316546079 的回复:
引用 1 楼 luzhengyue07 的回复:程序会Sleep 1000s,之后应该会正常。 引用 11 楼 kxltsuperr 的回复:引用 10 楼 mujiok2003 的回复:引用 9 楼 kxltsuperr 的回复:那到底该如何写这段代码,请明示吧.................................. 希望都是明示,没有暗示 C……
不等待会不会出现线程不同步的问题呢?
小小爬虾 2013-03-10
  • 打赏
  • 举报
回复
引用 10 楼 mujiok2003 的回复:
引用 9 楼 kxltsuperr 的回复:那到底该如何写这段代码,请明示吧.................................. 希望都是明示,没有暗示 C/C++ code?1234567891011121314151617181920212223//只是一个简单fix, 自己改进bool shutdown = false;unsigned int ……
不等待会不会出现线程不同步的问题呢?
mujiok2003 2013-03-10
  • 打赏
  • 举报
回复
引用 7 楼 kxltsuperr 的回复:
我改了一下代码,创建了一个新的子线程执行代码,为什么还是有问题,未响应呢?

WaitForSingleObject(handle,INFINITE);	//这里还是相当于循环,变了一个形式而已
小小爬虾 2013-03-10
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
引用 4 楼 kxltsuperr 的回复:to mujiok2003: 我还是不太明白,可以说的更详细些吗?或者可以改善一下我这个小程序的代码么? 谢谢! UI线程的模型: C/C++ code?1234567while(true){ peak next message(); process message() //调用XXX::OnBut……
我改了一下代码,创建了一个新的子线程执行代码,为什么还是有问题,未响应呢?
//子线程函数
unsigned int __stdcall ThreadFun(PVOID pM)
{
	int i=1;
	while (i<10000)
	{
		i=i+1;
		Sleep(100);
	}
	AfxMessageBox("执行完毕");
	return 0;
}
void CTest_WhileDlg::OnButton1() 
{
	//创建一个新的子线程,运行自己想要的代码
	HANDLE handle=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,NULL);
	WaitForSingleObject(handle,INFINITE);	
}
_lee_chong 2013-03-10
  • 打赏
  • 举报
回复
引用 1 楼 luzhengyue07 的回复:
程序会Sleep 1000s,之后应该会正常。
引用 11 楼 kxltsuperr 的回复:
引用 10 楼 mujiok2003 的回复:引用 9 楼 kxltsuperr 的回复:那到底该如何写这段代码,请明示吧.................................. 希望都是明示,没有暗示 C/C++ code?1234567891011121314151617181920212223//只是一个简单fix, 自己改进bool shutdow……
你这是想实现什么呢。。。不要俩按钮,你把控制线程结束的标识取消不就行了
mujiok2003 2013-03-10
  • 打赏
  • 举报
回复
引用 11 楼 kxltsuperr 的回复:
引用 10 楼 mujiok2003 的回复:引用 9 楼 kxltsuperr 的回复:那到底该如何写这段代码,请明示吧.................................. 希望都是明示,没有暗示 C/C++ code?1234567891011121314151617181920212223//只是一个简单fix, 自己改进bool shutdow……
给你讲了思路了,大哥变通一下吧。
小小爬虾 2013-03-10
  • 打赏
  • 举报
回复
引用 10 楼 mujiok2003 的回复:
引用 9 楼 kxltsuperr 的回复:那到底该如何写这段代码,请明示吧.................................. 希望都是明示,没有暗示 C/C++ code?1234567891011121314151617181920212223//只是一个简单fix, 自己改进bool shutdown = false;unsigned int ……
你好mujiok2003,可以不用两个按钮吗? 我就想只用一个按钮解决这个问题。
mujiok2003 2013-03-09
  • 打赏
  • 举报
回复
引用 4 楼 kxltsuperr 的回复:
to mujiok2003: 我还是不太明白,可以说的更详细些吗?或者可以改善一下我这个小程序的代码么? 谢谢!
UI线程的模型:

while(true)
{
   peak next message(); 
   process message() //调用XXX::OnButton1(...),这个函数一直运行,
  //后面的消息一直得不到处理,因为只有一个UI线程。

}
lin5161678 2013-03-09
  • 打赏
  • 举报
回复
开呀开线程咯
小小爬虾 2013-03-09
  • 打赏
  • 举报
回复
to mujiok2003: 我还是不太明白,可以说的更详细些吗?或者可以改善一下我这个小程序的代码么? 谢谢!
mujiok2003 2013-03-09
  • 打赏
  • 举报
回复
UI线程(一般就一个)一直在这个函数中,被阻塞了,其他消息得不到响应,这是一个糟糕的设计。 解决办法:让工作线程处理业务耗时的业务,UI线程只处理简单快速的任务(比如,UI绘制,任务分派等)
tiannailu 2013-03-09
  • 打赏
  • 举报
回复
程序Sleep之后让出CPU使用,当Sleep完之后继续执行该函数。 对话框中所有的消息都得不到相应。
luzhengyue07 2013-03-09
  • 打赏
  • 举报
回复
程序会Sleep 1000s,之后应该会正常。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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