CWinThread::PumpMessage函数的作用是什么?

3
在调试一个用C++开发的Windows应用程序时,我发现了这个函数调用CWinThread::PumpMessage()。我已经在MSDN和其他一些论坛帖子中阅读了相关内容以便理解这个函数,但仍不确定它的作用是什么。能否有人帮助我理解一下这个函数的用途?
1个回答

4

这是一个方便的函数,可以防止窗口锁死。在MFC应用程序中使用如下:

void PumpWaitingMessages(){
   MSG msg; 
   while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
      if (!AfxGetThread()->PumpMessage()) 
         return;
   }
}

例如,在对话框中考虑以下函数:
void CMyDialog::OnOK(){
       for (int i = 0; i < 50; i++){
          PumpWaitingMessages();
          Sleep(100);
          //do some lengthy calculations
       }
       MessageBox("done");
       CDialog::OnOK();
    }

如果您调用以上函数,程序应该会锁定线程5秒钟。但是PumpWaitingMessages();将允许程序响应键盘和鼠标输入。但要小心,例如,如果连续两次单击“确定”按钮,则程序将关闭对话框两次...

2
这会导致各种棒极了的可重入问题出现。还会出现口吃现象。而且,根据其他事件所需时间的长短,它不能保证“锁定线程5秒钟”。 - Blindy
这并不是要锁定线程。你读了我的帖子吗?为什么有人想以这种方式锁定线程?只要不用它来替代多线程,这个方法就没什么问题。它只是防止窗口冻结。 - Barmak Shemirani
1
没错,这并不是为了新代码而设计的(在这种情况下应该使用多线程),但它可以拯救旧代码中的问题,而不必像新线程那样进行大的更改。 - zar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接