急问一个基础问题,我这样的思路是否有问题

amy3701229 2006-07-06 02:21:31
控制台程序:
void main()
{
CreateNewThread(TRUE);//建立一个新的线程
char ch;
while(1)
{
printf("测试,按Q键退出");
ch = _getch();//如果没有用户输入,就将CPU控制权交给其他线程
case 'Q':
goto out_exit;
return nRetCode;
}
}
上面的程序CPU占用率很低,程序运行也很正常,改成对话框程序,在一个BUTTON事件中:
void mydlg::OnButton1()
{
CreateNewThread(TRUE);//建立一个新的线程
while(1)
{
Sleep(100);//将CPU控制权交给其他线程
}

}
这个做法是CPU占用率也不高,按钮按下后应用程序在工作,但是对话框没有响应,鼠标一直是漏斗状
我有两个问题:
1、为什么在控制台下那样的做法把CPU的控制权交给建立的线程是可以的,而对话框程序不行,对话
框程序要实现控制台那样的效果该怎么做?
2、为什么新建的线程CreateNewThread(TRUE)没有立即运行,而是要等到ch = _getch()之类的语句才
开始处理线程的代码?

...全文
196 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2006-07-07
  • 打赏
  • 举报
回复
楼主对 Windows 消息完全不理解,对线程也不理解。

void mydlg::OnButton1() 这个函数不退出,界面线程无法处理其他消息(在那阻塞呢!),你用向导新建一个 Win32 Application ,看看消息循环就知道了。

还有尽量不要用 Sleep ,可以用 WaitForSingleObject 。
LuoMuFeng 2006-07-07
  • 打赏
  • 举报
回复
你怎么知道进不了线程?你在线程里设一个断点试试看,看它会不会在那里中断。
amy3701229 2006-07-06
  • 打赏
  • 举报
回复
不行删除,删掉这几行,连线程都进不了
LuoMuFeng 2006-07-06
  • 打赏
  • 举报
回复
上面的“跟据”要改为“根据”。
几乎每次发帖,都忍不住要说一次:CSDN不能修改帖子,真是太不方便了。
LuoMuFeng 2006-07-06
  • 打赏
  • 举报
回复
第一个问题:

在对话框程序中,只要把下面这段代码删除就可以了:
while(1)
{
Sleep(100);//将CPU控制权交给其他线程
}

第二个问题:
新线程什么时候执行,并没有一个固定的时候,也没有办法预测。不要去猜想它什么时候开始运行,也不能跟据几次观察的结果就断定它是什么时候运行的。
Kumgen 2006-07-06
  • 打赏
  • 举报
回复
主窗口线程被阻塞了

16,550

社区成员

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

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

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