0

所以我用 C++ 制作了一个 GUI,每次单击按钮两次时都会调用一个子进程。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 回答