2012-01-19 69 views
0

我试图运行其他进程,我们假设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(); 
    ... 
} 

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

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

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

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

1)什么原因?

2)什么是解决方案?

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

+1

原因在您的代码段中不可见。启动一个进程不需要启动一个线程,通常不会超过50毫秒。所以大概你正在使用线程出于其他原因,这可能解释延迟的原因。 –

+0

如果我想同时执行50个进程,该怎么办?我应该等2.5秒吗?由于太多的静态用法,我有很多第三方库的线程问题,我不得不使用多处理而不是多线程。在这一点上,我的主要应用程序应该能够流畅地运行而不会有任何悬而未决的问题。但多处理引起意外悬挂。我需要的是,即使我执行了100个进程,但如果硬件能够运行这些进程,我的应用程序不应受其影响。 –

+0

目前3或4个进程也可以锁定我的主应用程序,如果它们被锁定的话。但其他进程,比如Internet Explorer窗口,不受它们的影响。所以,操作系统工作没有问题,但我的应用程序是唯一受这些进程影响的应用程序。我想要的是能够执行其他流程,例如我与他们没有任何关系。这应该可以使用本机Win32函数,但问题是,我将需要稍后的主窗口句柄。但即使我没有在process-> Start();之后执行任何操作,也会出现此问题。 –

回答

1

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