所以我用 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 毫秒计时器定期重新启动该过程,因此我首先使用按钮测试了重新启动过程。但似乎无法读取新生成的输出。
任何帮助,将不胜感激 :)