为什么CreateProcess()之后的WaitForSingleObject()显示AppStarting游标?

时间:2013-12-27 02:03:25

标签: windows winapi createprocess waitforsingleobject

我写了一个简单的启动器,它查找实际程序然后执行它。这工作正常,但有一个问题:Windows显示“带沙漏的指针”光标约为秒。如果我直接启动程序,就不会发生这种情况。

我尝试设置sinfo.dwFlags = STARTF_FORCEOFFFEEDBACK,但这没有帮助。我想这是因为我的程序以某种方式需要禁用光标,我启动的程序就可以了(它会创建一个合适的窗口等)。

这是我的申请中的相关代码。我没有任何线程或任何其他花哨的东西(该程序的唯一目的是启动另一个程序并将退出代码传递给它的调用者,以防它关心它):

STARTUPINFO sinfo = {0};
PROCESS_INFORMATION pinfo = {0};
if (!CreateProcess(program, buf, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
    Fail("Could not launch Vim");
}
if (WaitForSingleObject(pinfo.hProcess, INFINITE) == WAIT_FAILED) {
    Fail("WaitForSingleObject");
}

2 个答案:

答案 0 :(得分:4)

显然,Windows期望Windows程序处理消息,并且不认为它在此之前完全启动,这就是显示appstarting游标的原因。

添加以下代码来处理单个虚拟消息解决了问题:

MSG msg;
PostMessage(NULL, WM_NULL, 0, 0);
GetMessage(&msg, NULL, 0, 0);

答案 1 :(得分:2)

您的程序正在显示沙漏图标,因为您的UI线程由于在WaitForSingleObject调用上停滞而挂起。请记住,WaitForSingleObject直到子进程退出后才会返回。您可以使用Sleep替换Wait调用并获得相同的效果。

你有一些选择:

  1. 使用MsgWaitForMultipleObjects代替WaitForSingleObject。这是更正式的方式来抽取消息并同时等待,而不是您在自己的答案中建议的PostMessage / GetMessage。

  2. 在另一个线程上执行Wait调用。当线程返回时,它会向你的UI线程发送一些PostMessage来表明它已经完成。

  3. 在上述两种情况下,当子进程仍在发生时,UI将对点击和输入事件做出响应。您需要对UI线程进行编码以适当处理(如果有必要)。