読者です 読者をやめる 読者になる 読者になる

Real Loop in Win32 Program

Windows

To introduce real loop in Win32 program. “GetMessage()” need to be replaced by “PeekMessage()” The traditional GetMessage loop looks like:

while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            break;
        } else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

The PeekMessage Program is like:

while(!Stop){
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    DoCalculation();
    }

Ref:

关于Windows中的系统消息循环占用CPU的疑问

GetMessage函数是一个阻塞型的函数,当消息队列中没有消息时,GetMessage会处于阻塞状态。一旦有消息到达,进程会被唤醒,GetMessage马上返回。实现时,使用了一个信号量, GetMessage函数在确定没有消息可读时,对这个信号量进行一个V操作,从而使线程阻塞。而PostMessage、SendNotifyMessage、SendSyncMessage等任何一个发送消息函数在发送完消息之后,都会读取这个信号量的值,当发现这个值等于零时,即表示读消息的线程当前已阻塞,这时就会作一次P操作,来唤醒睡眠的线程。

blog.csdn.net

book.51cto.com