そこで、ボタンが 2 回クリックされるたびに子プロセスを呼び出す GUI を C++ で作成しました。StandardOutput はリダイレクトされ、ShellExecute を使用しません。
私はそれをテストするために単純なダミープロセスを作成しました.dummy.exeとしましょう。これは基本的にこれを行うだけです:
void() {
printf("0");
}
それだけです。0 がプロットされた後、プロセスは終了します。
ボタンをクリックするとプロセスが開始され、次のようになります。
private: System::Void bt_getData_Click(System::Object^ sender, System::EventArgs^ e) {
if (bt_getData->Text == "Get Data") {
proc->Start();
bt_getData->Text = "Stop";
}
else if (bt_getData->Text == "Stop") {
bt_getData->Text = "Get Data";
}
}
次に、OutputDataReceived EventHandler を使用して出力を読み取ります。問題は、ボタンをもう一度クリックすると、プロセスが再起動されますが、GUI が新しい出力を読み取れないことです。
ケース 1 : OutputDataReceived EventHandler で読み取った出力をキャンセルしてプロセスを再起動しましたが、次に再起動されたプロセスの出力を読み取れません。
private: System::Void outputData(System::Object^ sender, System::Diagnostics::DataReceivedEventArgs^ e) {
x0 = xt;
xt += 1;
if (xt*x_scale > pb_Graph->Width) {
x0 = 0;
xt = 0;
imgTemp = gcnew Bitmap(pb_Graph->Image, 460, 460);
gpcGraph->Clear(Color::Transparent);
}
y0 = yt;
yt = Convert::ToInt16(e->Data);
ret_index++;
if (ret_index > 2047) ret_index = 0;
gpcGraph->DrawLine(greenPen,(float)x0*x_scale,pb_Graph->Height - (float)y0/y_scale - y_null,(float)xt*x_scale,pb_Graph->Height - (float)yt/y_scale - y_null);
pb_Graph->Refresh();
}
3 回再起動した後、このエラーが表示されます: System.dll で「System.InvalidOperationException」タイプの未処理の例外が発生しました
Additional information: An async read operation has already been started on the stream.
ケース 2 : 出力の読み取りをキャンセルしませんでした。ケース 1 と同じエラーが表示されますが、それでも理解できます。
ケース 3 : 再起動時に BeginOutputReadLine() をやり直していません。エラーは表示されませんが、再起動されたプロセスの出力は読み取れません。
私の実際の目標は、1 ミリ秒のタイマーを使用して定期的にプロセスを再起動することなので、最初にボタンを使用して再起動プロセスをテストしました。しかし、新しく生成された出力を読み取れないようです。
どんな助けでも大歓迎です:)