17 个解决方案
#1
为什么要在主线程当中??你这样做必然的啊
开个线程,然后通过这个线程替代你现在让主线程干的事
开个线程,然后通过这个线程替代你现在让主线程干的事
#2
骚逮撕奶,另问还有别的方法吗?
#3
另外,现在网络盛传的sleep 占用大量CPU是否为真,小菜同问
#4
sleep会放出CPU,不会导致 占用大量CPU
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件
#5
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应
#6
线程退出时候发消息给主线程,不需要主线程进行监视
#7
那有什么好方法呢?
#8
能给出稍微具体一点的步骤吗
#9
用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:
start:
while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
goto end;
DispatchMessage(msg); // 分发攫取到的消息
}
// 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
// 现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
do_your_job_piece();
// 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
if(!GetMessage(msg, NULL, 0, 0))
goto end;
DispatchMessage(msg); // 分发
goto start; // 重复这个过程
end: 结束
代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。
start:
while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
goto end;
DispatchMessage(msg); // 分发攫取到的消息
}
// 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
// 现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
do_your_job_piece();
// 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
if(!GetMessage(msg, NULL, 0, 0))
goto end;
DispatchMessage(msg); // 分发
goto start; // 重复这个过程
end: 结束
代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。
#10
谢谢分享,另求更多方法
#11
尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。
#12
尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。
#13
尽量不要在主线程处理。
#14
主线程就不应该延时
什么和延时有关的方法都不该用
什么和延时有关的方法都不该用
#15
+++
#16
谢谢各位,小弟又开了一个线程延时等待判断,就解决这个问题了,结贴
#17
不要在 CXXXDlg 的事件处理函数中 进行工作量大、占用时间长的任务。必然“未响应”。
可以放在其他线程里完成。
可以放在其他线程里完成。
#1
为什么要在主线程当中??你这样做必然的啊
开个线程,然后通过这个线程替代你现在让主线程干的事
开个线程,然后通过这个线程替代你现在让主线程干的事
#2
骚逮撕奶,另问还有别的方法吗?
#3
另外,现在网络盛传的sleep 占用大量CPU是否为真,小菜同问
#4
sleep会放出CPU,不会导致 占用大量CPU
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件
#5
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应
#6
线程退出时候发消息给主线程,不需要主线程进行监视
#7
那有什么好方法呢?
#8
能给出稍微具体一点的步骤吗
#9
用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:
start:
while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
goto end;
DispatchMessage(msg); // 分发攫取到的消息
}
// 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
// 现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
do_your_job_piece();
// 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
if(!GetMessage(msg, NULL, 0, 0))
goto end;
DispatchMessage(msg); // 分发
goto start; // 重复这个过程
end: 结束
代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。
start:
while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
goto end;
DispatchMessage(msg); // 分发攫取到的消息
}
// 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
// 现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
do_your_job_piece();
// 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
if(!GetMessage(msg, NULL, 0, 0))
goto end;
DispatchMessage(msg); // 分发
goto start; // 重复这个过程
end: 结束
代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。
#10
谢谢分享,另求更多方法
#11
尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。
#12
尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。
#13
尽量不要在主线程处理。
#14
主线程就不应该延时
什么和延时有关的方法都不该用
什么和延时有关的方法都不该用
#15
+++
#16
谢谢各位,小弟又开了一个线程延时等待判断,就解决这个问题了,结贴
#17
不要在 CXXXDlg 的事件处理函数中 进行工作量大、占用时间长的任务。必然“未响应”。
可以放在其他线程里完成。
可以放在其他线程里完成。