Исключение при чтении вывода процесса - PullRequest
0 голосов
/ 30 октября 2018

Моя проблема заключается в следующем:

У меня есть пользовательский интерфейс, созданный в Visual Studio с C ++ / CLI. Теперь у меня есть событие кнопки, которое создает процесс, который запускает консольное приложение C ++ с параметрами.

Это отлично работает, консольное приложение выполняется с параметрами без ошибок, и я также вижу окно консоли с правильным выводом.

Но я все еще получаю исключение:

StandardOut не был перенаправлен или процесс еще не начался.

Я думаю, что это как-то связано с Streamreader и некоторыми DataReceivedEvents, но я понятия не имею.

Это мой код:

try {

        String^ parameters = tbLoadXML->Text + " " + tbNumberAnts->Text + " " + tbIteration->Text + " " + tbReduction->Text + " " + tbPheromoneDeposit->Text + " " + tbPheromoneReduction->Text + " " + tbAlpha->Text + " " + tbBeta->Text + " " + reduce.ToString() + " " + algorithm.ToString() + " " + probabilityalgorithm.ToString() + " " + numbercities.ToString();

        Process^ process = gcnew Process();
        process->StartInfo->UseShellExecute = false;
        process->StartInfo->CreateNoWindow = true;      
        process->StartInfo->RedirectStandardOutput = true;
        process->Start("TSPACO.exe", parameters);

        StreamReader^ reader = process->StandardOutput;
        String^ output = reader->ReadToEnd();       

        textBox1->Text += output;

        process->WaitForExit();
        process->Close();
    }
    catch (Exception^ ex) {
        MessageBox::Show(ex->Message);
    }   

Я также попробовал цикл while:

while (!process->StandardOutput->EndOfStream)
{
            textBox1->Text += process->StandardOutput->ReadLine();
}

Но на самом деле ничего не работает - я понятия не имею, почему.

1 Ответ

0 голосов
/ 30 октября 2018

Итак, я нашел решение для своей проблемы - я понятия не имею, почему это работает, но я думаю, что хитрость заключается в том, чтобы создать ProcessStartInfo-Object со всеми необходимыми свойствами, а затем просто использовать метод по умолчанию Process :: Start без любые параметры:

    ProcessStartInfo^ startInfo = gcnew ProcessStartInfo();
    startInfo->FileName = "TSPACO.exe";
    startInfo->Arguments = parameters;
    startInfo->UseShellExecute = false;
    startInfo->CreateNoWindow = true;
    startInfo->RedirectStandardOutput = true;

    Process^ process = gcnew Process();
    process->StartInfo = startInfo;
    process->Start();

    StreamReader^ reader = process->StandardOutput;
    String^ output = reader->ReadToEnd();

    textBox1->Text += output;

    process->WaitForExit();
    process->Close();
...