即使使用线程,启动进程也会挂起主进程

时间:2012-01-19 15:33:14

标签: .net multithreading process c++-cli hang

我正在尝试从我的主应用程序ChildProcess.exe运行其他进程,让我们假设Main.exe,并且我希望没有挂起,因为我没有尝试捕获输出,只有shell执行。但不知何故,我的Main.exe在某些情况下会挂起。这两个可执行文件都有.NET表单,但在尝试访问窗口句柄之前会出现此问题。基本上我所做的就是下面的事情。

MAIN.EXE

这是我为流程执行代码创建新线程的方法

...
ThreadStart^ threadStart = gcnew ThreadStart(this, &MyForm::CreateNewProcessThread);
Thread^ thread = gcnew Thread(threadStart);
thread->Start();
...

这是线程函数

System::Void MyForm::CreateNewProcessThread() {
    String^ ApplicationPath = Application::ExecutablePath->Substring(0, Application::ExecutablePath->LastIndexOf("\\"));
    ...
    Process^ p = gcnew Process();
    p->StartInfo->FileName = ApplicationPath + "\\ChildProcess.exe";
    p->StartInfo->UseShellExecute = true;
    p->StartInfo->RedirectStandardOutput = false;
    p->StartInfo->RedirectStandardError = false;
    p->Start();
    ...
}

ChildProcess没什么特别的。您可以尝试一个空表单应用程序,这没关系。当我尝试同时运行多个进程时,我的主应用程序开始挂起。它不像死锁一样永远挂起。它只挂起不到1秒钟,但它仍然在第一个进程执行时挂起。当ChildProcess.exe启动(完全加载)一次后,Main.exe不会受到影响。但是如果我们为Form_Load事件设置一个无限循环,比如“while(1);”并且尝试同时执行一些进程(仅限3或4),Main.exe几乎完全被锁定。

这可能是由STAThread结构引起的,但由于我使用System.Windows.Forms命名空间,这看起来是必须的。

我不明白的是,如果我把无限循环放到我的线程(MyForm::CreateNewProcessThread()),我的应用程序根本不受这个无限循环的影响,因为它是一个单独的线程。但是当我尝试从该线程启动进程时,我的整个应用程序(包括我的主线程)都会受到影响。

我对这个问题有两个问题。

1)原因是什么?

2)解决方案是什么?

P.S:我在stackoverflow上检查了类似的线程,但没有一个提供真正的解释或真正的解决方案。请不要给我链接其他stackoverflow问题。我已经检查了所有这些。

1 个答案:

答案 0 :(得分:1)

我无法找到解决问题的“托管”方式。所以我使用了Win32 API(CreateProcess()FindWindow()WaitForInputIdle()EnumThreadWindows()等。现在它没有挂起,但我仍然不知道.NET的Process类有什么问题。