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

怎样让挂起的线程自动唤醒?
windows消息循环中,因为GetMessage()能将线程挂起,所以消息循环不会占用100%的CPU。当有消息到来时可以自动将挂起的线程唤醒以便处理消息。

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

消息循环中的GetMessage()函数的原理究竟是什么?是采用了中断吗?它究竟是不是一直不停地在检测消息队列?如果一直不停的检测,那CPU占用率肯定会达到100%的呀。如果它并不是一直不停的检测,那么它怎么知道队列中有消息到来了呢?

------解决方案--------------------
《深入浅出MFC》第2版 27页:

……
当操作系统再次回来照顾此一执行线程,而发现消息队列中仍然是空的,这时候两个API
函数的行为就有不同了:
GetMessage 会过门不入,于是操作系统再去照顾其它人。
PeekMessage 会取回控制权,使程序得以执行一段时间。
……

------解决方案--------------------
拷贝的一段代码,针对你的需求自己改改。

C/C++ code

#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; 
}