HWND hwnd;
BOOL fDone;
MSG msg;
// Begin the operation and continue until it is complete
// or until the user clicks the mouse or presses a key.
fDone = FALSE;
while (!fDone)
{
fDone = DoLengthyOperation(); // application-defined function
// Remove any messages that may be in the queue. If the
// queue contains any mouse or keyboard
// messages, end the operation.
while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
//
// Perform any required cleanup.
//
fDone = TRUE;
}
}
}
上述msdn的这段话是什么意思呢?DoLengthyOperation();这个耗时的操作也要先执行完了才行啊。还是有别的玄机。还有我想知道下面是如何实现的,能讲解一下吗
在单线程程序中,如果要执行一个长时间的复杂操作而且界面要有相应的话,可以考虑用自己的消息泵。比如,可以将一个阻塞等待操作放在一个循环中,并将超时值设置得比较小,然后每个等待的片段中用消息泵继续消息循环,使界面能够响应用户操作。等等之类,都可以应用消息泵(调用一个类似这样的函数):BOOL CChildView::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
}
mfc消息循环peekmessage
BOOL fDone;
MSG msg;
// Begin the operation and continue until it is complete
// or until the user clicks the mouse or presses a key.
fDone = FALSE;
while (!fDone)
{
fDone = DoLengthyOperation(); // application-defined function
// Remove any messages that may be in the queue. If the
// queue contains any mouse or keyboard
// messages, end the operation.
while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
//
// Perform any required cleanup.
//
fDone = TRUE;
}
}
}
上述msdn的这段话是什么意思呢?DoLengthyOperation();这个耗时的操作也要先执行完了才行啊。还是有别的玄机。还有我想知道下面是如何实现的,能讲解一下吗
在单线程程序中,如果要执行一个长时间的复杂操作而且界面要有相应的话,可以考虑用自己的消息泵。比如,可以将一个阻塞等待操作放在一个循环中,并将超时值设置得比较小,然后每个等待的片段中用消息泵继续消息循环,使界面能够响应用户操作。等等之类,都可以应用消息泵(调用一个类似这样的函数):BOOL CChildView::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
}
mfc消息循环peekmessage
解决方案 »
- 如何获取SendMessage(WM_COMMAND, ID_FILE_SAVE_AS, 0)之后弹出的另存为对话框的是否保存信息
- 关于在Ctaskdialog中实现进度条的问题
- 发送请求到NetBios name service的问题
- 问个思路,请问Screen2Exe这种软件是如何实现的?
- 确定记录集是否存在???(在线)
- 怎样使用程序在任务栏中显示和隐藏(不是在托盘中)?
- 如何找到局域网中的其它计算机?就像WINDOWS的网上邻居那样。
- 急需显示数据库的控件!!!!!!!
- Visual Studio 7.0 的安装问题!!!!
- 编程关机中的难题?
- vs2010里的虚拟目录,也就是.vcxproj.filters没有生效
- 关于MakeFile问题
第二种方式更加常用些,比如还是一个长时间操作,现在用循环,每次循环调用一下PeekAndPump函数,窗口消息泵就不会死锁。
第二种方式的的长时间操作也是上面那个意思吧,那么这两种方式就是一样的。有什么不一样吗BOOL CChildView::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
具体都是什么意思,如何实现那功能的。
感谢各位大神啊!
在单线程程序中,如果要执行一个长时间的复杂操作而且界面要有相应的话,可以考虑用自己的消息泵。比如,可以将一个阻塞等待操作放在一个循环中,并将超时值设置得比较小,然后每个等待的片段中用消息泵继续消息循环,使界面能够响应用户操作。等等之类,都可以应用消息泵(调用一个类似这样的函数):BOOL CChildView::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
}
这个PeekAndPump所实现的功能,实际上就是MFC框架定义的函数PumpMessage的雏形。你可以直接在循环中调用PumpMessage来实现在繁忙的循环中响应界面消息。比如在一个一万次的循环处理中加入PumpMessage的调用。这样每循环一次就会检查有没有消息,有的话就处理完这些消息再继续循环
AfxGetMainWnd()->EnableWindow(FALSE);
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{ } 我把窗口EnableWindow了,应该是说窗口不能接受消息;Enables or disables mouse and keyboard input to the specified window or control.但是::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)这句话就永不返回false了。意思就是一直有消息在产生,我调试也发现了,消息一直都在变化,就是不完。