2012-01-19 8 views
0

他のプロセスを実行しようとしています。私のメインアプリケーションMain.exeからChildProcess.exeと仮定しましょう。出力をキャッチしようとしていないので、 。しかし何とか、私の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())すると、別のスレッドであるため、私のアプリケーションはこの無限ループの影響を全く受けません。しかし、そのスレッドからプロセスを開始しようとすると、メインスレッドを含む私のアプリケーション全体が影響を受けます。

この問題について2つの質問があります。

1)理由は何ですか?

2)解決策は何ですか。

P.S:stackoverflowで同様のスレッドを確認しましたが、実際の説明や実際の解決策はありませんでした。私は他のstackoverflowの質問にリンクを与えないでください。私はすでにそれらすべてをチェックしました。

+1

理由があなたのスニペットに表示されません。プロセスの開始はスレッドの開始を必要とせず、通常は50ミリ秒を要しません。おそらく、あなたは他の理由でスレッドを使用しています。遅延の理由を説明することができます。 –

+0

同時に50のプロセスを実行したいのですが?私は2.5秒待つべきですか?あまりにも多くの静的な使用法のために私はサードパーティライブラリに多くのスレッド問題を抱えていたので、マルチスレッドの代わりにマルチプロセッシングを使用しなければなりませんでした。この時点で、私の主なアプリケーションは、ぶら下がりの問題なしに流暢に実行できるはずです。予期せぬことにマルチプロセッシングが原因でハンギングが発生しました。私が必要とするのは、たとえ100のプロセスを実行しても、ハードウェアがこれらを実行するのに十分な能力を持っていれば、私のアプリケーションは影響を受けてはならないということです。 –

+0

現時点では、プロセスがロックされていると、3つまたは4つのプロセスがメインアプリケーションをロックする可能性があります。しかし、他のプロセスでは、Internet Explorerのウィンドウは影響を受けていません。したがって、OSは問題なく動作していますが、私のアプリケーションはこれらのプロセスの影響を受ける唯一のアプリケーションです。私が望むのは、他のプロセスを実行できることです。私はそれらと関係がないのです。これは、ネイティブのWin32関数を使用して行うことができますが、問題は、後でメインウィンドウのハンドルが必要になることです。しかし、この問題は、process-> Start();の後に何もしなくても発生します。 –

答えて

1

問題を解決するための「管理された」方法が見つかりませんでした。だから私はWin32 API(CreateProcess()FindWindow()WaitForInputIdle()EnumThreadWindows()など)を使いました。今は掛からずに作業していますが、.NETのProcessクラスで何が問題なのかまだ分かりません。

関連する問題