2012-01-19 112 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類有什麼問題。