0

そこで、ボタンが 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 ミリ秒のタイマーを使用して定期的にプロセスを再起動することなので、最初にボタンを使用して再起動プロセスをテストしました。しかし、新しく生成された出力を読み取れないようです。

どんな助けでも大歓迎です:)

4

1 に答える 1

0

わかりました...呼び出す別の方法を使用してエラーを防ぐことができました

process->StandardOutput->ReadLine();

この方法では、非同期ストリームの読み取りは発生しません。

于 2013-09-14T12:09:44.050 に答える