怎样让挂起的线程自动唤醒?

苦寒 2012-09-18 09:54:29
windows消息循环中,因为GetMessage()能将线程挂起,所以消息循环不会占用100%的CPU。当有消息到来时可以自动将挂起的线程唤醒以便处理消息。

我自己也想实现这样的功能,我用SuspendThread挂起线程后,必须自己在一个合适的时候调用ResumeThread才能将它唤醒,可很多时候我希望程序能够自己判断何时需要被唤醒,比如:某个变量的值被修改了,就自动唤醒该线程,就如同GetMessage()函数那样,当有消息来了,就自动唤醒线程以处理消息。这应该如何实现呢?

消息循环中的GetMessage()函数的原理究竟是什么?是采用了中断吗?它究竟是不是一直不停地在检测消息队列?如果一直不停的检测,那CPU占用率肯定会达到100%的呀。如果它并不是一直不停的检测,那么它怎么知道队列中有消息到来了呢?
...全文
194 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
饿半肚 2012-09-18
  • 打赏
  • 举报
回复
《深入浅出MFC》第2版 27页:

……
当操作系统再次回来照顾此一执行线程,而发现消息队列中仍然是空的,这时候两个API
函数的行为就有不同了:
GetMessage 会过门不入,于是操作系统再去照顾其它人。
PeekMessage 会取回控制权,使程序得以执行一段时间。
……
chayedanwc 2012-09-18
  • 打赏
  • 举报
回复
拷贝的一段代码,针对你的需求自己改改。


#define WM_THREAD_DOSOMETHING WM_USER+101
#define WM_THREAD_RESUME WM_USER+102

//CDlg->dwThreadId:当前线程的ID;
VOID MyThread(LPVOID lPvoid)
{
CThreadMethodDlg* CDlg = (CThreadMethodDlg*)lPvoid;
MSG msg;

PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
while(GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_THREAD_RESUME:
TRACE(_T("Resume\n"));
Sleep(10);

PostThreadMessage(
CDlg->dwThreadId,
WM_THREAD_RESUME,
0,
0
);

break;

case WM_THREAD_DOSOMETHING:
TRACE(_T("Do something\n"));
//干你需要干的事情
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);

break;


case WM_CLOSE:
TRACE(_T("Close\n"));
return;
}
}

return;
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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