CreateProcess 不在主线程中
Posted
技术标签:
【中文标题】CreateProcess 不在主线程中【英文标题】:CreateProcess not in primary thread 【发布时间】:2015-02-11 16:32:38 【问题描述】:我使用 CreateProcess() 从我的 C++ 代码中启动另一个程序。 helppage 说它
创建一个新进程及其主线程。新进程在调用进程的安全上下文中运行。
我想把它放在他自己的线程中,这样应用程序就可以继续运行。有什么简单的方法吗?我对 boost 和 Co 不熟悉。
我的代码:
bool startup(LPWSTR lpApplicationName)
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
lpApplicationName, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // 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
)
printf( "CreateProcess failed (%d).\n", GetLastError() );
return false;
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return true;
以及如何调用函数:
int _tmain(int argc, _TCHAR* argv[])
wchar_t path[] = L"C:\\path\\to\\paridise.exe";
startup(path);
【问题讨论】:
有什么问题?在这里你使用CreateProcess
,然后等待它使用WaitForSingleObject
完成。只需删除等待,它就不会等待。
awww,是时候停止工作回家了:D 非常感谢!
【参考方案1】:
修改 ElderBug 在回复中的评论
您的代码中的问题是在CreateProcess
调用之后存在无限等待:
WaitForSingleObject(pi.hProcess, INFINITE);
只要注释掉,程序执行就不会停止。
我也犯了同样的错误,我偶然发现了这个 SO 问题;事实上,我们中的许多人都从 MSDN 示例 here 中获取代码(没有太多注意),实际上它有无限等待。
【讨论】:
以上是关于CreateProcess 不在主线程中的主要内容,如果未能解决你的问题,请参考以下文章
Matplotlib 和 :RuntimeError: 主线程不在主循环中: