内部消息循环
Internal message loop
在我的主对话框中,我有一个创建进程并等待它完成的函数。这可能需要15-20秒。如果我只是等待使用WaitForSingleObject我的对话框变得无响应。
我想使用EnableWindow(FALSE)和一个内部消息循环的组合来制作我的对话框,但不像MessageBox和DoModal那样看起来像应用程序冻结。但我不确定如何做到这一点内部消息循环
恐怕你的方法行不通。你的应用是单线程的,或者至少你的UI是。在你调用WaitForSingleObject之后,你的线程进入睡眠状态,它不会处理windows消息。拥有内部消息循环这一事实并不重要。您可能应该启动一个新线程,并使用它来等待进程完成,然后通知您的UI线程并退出。或者类似的东西
运行内部消息循环是相当琐碎的编码。
如下所示:
EnableWindow(FALSE);
while ( /* check for my exit condition */ )
{
MSG msg;
if(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if( !AfxGetApp()->PumpMessage() )
{
::PostQuitMessage(0);
}
}
}
EnableWindow(TRUE);
要等待进程退出,可以在消息循环中使用非常短的(<30ms)超时WaitForSingleObject
调用。或者MsgWaitForMultipleObjects
。或GetExitCodeProcess
我想推荐另一种方法。
1)显示新的模式弹出窗口
2)在OnInitDialog处理程序中启动进程并启动计时器
3)检查进程是否仍在OnTimer处理程序中运行,通过GetExitCodeProcess
4)当进程不再运行时调用EndDialog
尝试MsgWaitForMultipleObjects函数;它可以在等待事件对象时处理Windows消息。
你可以:
- (有点复杂)使用MsgWaitForMultipleObjects(或MsgWaitForMultipleObjectsEx)等待进程完成或等待消息到达(以正常方式处理)。
- (简单)使用RegisterWaitForSingleObject来注册一个回调,该回调在进程退出时在一个单独的线程中调用(并且可能让该回调只是向您的窗口发送消息)。
- (相当简单)创建自己的线程来执行等待。
我选择第二个选项
DWORD ec;
if(CreateProcess( NULL, // No module name (use command line).
szExe, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
procFlags, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
while(GetExitCodeProcess(pi.hProcess, &ec) && ec == STILL_ACTIVE)
{
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG lIdle = 0;
while(AfxGetApp()->OnIdle(lIdle++))
;
}
}
if(ec)
{
CloseHandle(pi.hProcess);
}
相关文章:
- 在 for 循环中处理复杂的发送 recv 消息
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
- C++循环:如何让程序在用户输入无效输入时多次重复"error"消息
- 如何循环函数,直到新的 mqtt 消息到达
- OpenGL 的 Win32 主消息循环
- Winapi:可以通过异步程序调用中断消息循环
- WinApi消息循环,Postmessage的工作原理与SendMessage类似
- 如何从VCL项目的消息循环中调用其他功能
- Win32 消息循环 - 我应该中断还是返回
- WinAPI设备通知-未进入消息循环
- SetWindowsHookEx忽略来自消息循环的PostMessage
- 相对于 3D 应用程序中的 Windows 消息循环的计时错误
- 当主循环正在侦听消息时,如何在特定时间退出程序
- infine windows消息循环-c++
- EDSDK消息循环在Windows 8.1下不起作用
- 使用Windows中另一个进程的事件循环向Qt应用程序发送退出消息
- Sleep() in Windows 消息循环
- C++ 有没有办法循环遍历一个向量,只有在完全搜索后才返回一条消息
- 对话框消息是否发送到自定义消息循环
- 是否可以捕获翻译/调度消息循环中的窗口消息/事件