从控制台程序读取输出

时间:2009-10-15 19:31:14

标签: .net console c++-cli

我需要在C ++ / .NET中读取本机C ++控制台应用程序的输出。有很多关于这个的文章,但大多数人都等到过程结束才能读取输出,这是我不想要的,我需要在过程“cout-ed”之后立即阅读它(并且不想要在这样做时阻止GUI,但这是我自己可以做的事情)。我试过两种方法。之一:

Diagnostics::Process ^process = gcnew Diagnostics::Process;
process->StartInfo->FileName = pathToExecutable;
process->StartInfo->RedirectStandardOutput = true;
process->StartInfo->UseShellExecute = false;
process->StartInfo->CreateNoWindow = true;
process->StartInfo->Arguments = "some params";
process->EnableRaisingEvents = true;
process->OutputDataReceived += gcnew Diagnostics::DataReceivedEventHandler( GUI::Form1::consoleHandler );
process->Start();
    process->BeginOutputReadLine();

处理程序:

    System::Void GUI::Form1::consoleHandler( System::Object^ sendingProcess, System::Diagnostics::DataReceivedEventArgs^ outLine ){
         GUI::Form1::contentForConsole += outLine->Data + "\n";
    }

但是调试器确认只有在完成该过程后才会调用它。

在我的第二次尝试中,我尝试创建自定义观看线程:

Diagnostics::Process ^process = gcnew Diagnostics::Process;
process->StartInfo->FileName = pathToExecutable;
process->StartInfo->RedirectStandardOutput = true;
process->StartInfo->RedirectStandardError = true;
process->StartInfo->UseShellExecute = false;
process->StartInfo->CreateNoWindow = true;
process->StartInfo->Arguments = "some params";

    processStatic = process; // static class member

process->Start();

System::Windows::Forms::MethodInvoker^ invoker = gcnew System::Windows::Forms::MethodInvoker(reader);
invoker->BeginInvoke(nullptr, nullptr);

在线程函数中,它等待ReadLine函数,直到进程结束:

System::Void GUI::Form1::reader(){
    System::String^ str;
    while ((str = geogenProcess->StandardOutput->ReadLine()) != nullptr)
    {
        contentForConsole += str; // timer invoked handler then displays this, but this line is called only once the process is finished
    }   
}

进程可执行文件会在几秒到几分钟的时间范围内输出多行文本(具体取决于实际任务)。

2 个答案:

答案 0 :(得分:1)

我最终设法找到了答案。两种读取控制台输出的方式都非常实用。问题出在控制台应用程序中。我不知道有必要手动刷新控制台输出以使其可供其他应用程序使用。

更换后:

cout << "Some stuff " << some_var << " more stuff\n";

cout << "Some stuff " << some_var << " more stuff\n" << flush;

就像魅力一样。

答案 1 :(得分:0)

为什么不将调用进程的输出重定向到文件并从程序中读取该文件? 如果子进程很好地刷新其输出,那么你得到了很好的响应。