【发布时间】:2017-11-22 08:21:36
【问题描述】:
我有以下场景:应用程序 B 应该启动应用程序 A,然后等待 A 空闲。为此,B 将 CreateProcess 与 WaitForInputIdle 结合使用,不幸的是,该命令的超时时间已设置为 INFINITE。
这是B的源码对应部分:
void StartA(void){
STARTUPINFO siInfo;
PROCESS_INFORMATION piInfo;
ZeroMemory(&siInfo, sizeof(siInfo));
ZeroMemory(&piInfo, sizeof(piInfo));
CreateProcess(L"A.exe", L"", 0, 0,
false, CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siInfo, &piInfo);
WaitForInputIdle(piInfo.hProcess, INFINITE); // A will block this command!
CloseHandle(piInfo.hProcess);
CloseHandle(piInfo.hThread);
}
当我从这个应用程序 B 调用我的应用程序 A 时,由于 A 的 TestThread 调用了 SendMessage 命令,B 将被它的 WaitForInputIdle 命令永远阻塞。如果我仅在 FormShow 事件之后创建 TestThread,那么 WaitForInputIdle 将按预期返回。这是一个解决方案,虽然我知道文章 WaitForInputIdle waits for any thread, which might not be the thread you care about,但我想了解这里实际发生的情况。
这是应用程序A的简化源代码。它只是由一个TForm和从TThread派生的类TestThread组成。
class TestThread : public TThread {
public:
__fastcall TestThread(HWND in_msg) : msg(in_msg), TThread(false) {};
virtual __fastcall ~TestThread(){};
private:
void __fastcall Execute(){
// Next line leads to WaitForInputIdle blocking
SendMessage(msg, WM_USER, NULL, NULL);
while(!Terminated) Sleep(1);
}
HWND msg;
};
class TFormA : public TForm{
private:
TestThread * testthread_p;
public:
__fastcall TFormA(TComponent* Owner){
testthread_p = new TestThread(Handle);
}
virtual __fastcall ~TFormA(){}
};
为什么WaitForInputIdle命令检测不到应用A的空闲状态?
【问题讨论】: