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 不在主线程中的主要内容,如果未能解决你的问题,请参考以下文章

C++线程分离进程

ICorDebug::CreateProcess 方法

为啥不在主线程(Android)中完成所有操作? [关闭]

Matplotlib 和 :RuntimeError: 主线程不在主循环中:

SetWinEventHook 与 CreateProcess, C++

从 UIView 制作 UIImage 但不在主线程中