C # Процесс не получает входные данные - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть процесс, который вызывает исполняемый файл Fortran. Исполняемый файл запрашивает файл у пользователя и выполняет операции, чтобы найти решение. Если в файле найдено несколько решений, программа спросит пользователя, хочет ли он найти наиболее оптимальное решение, в основном 2 входа для программы. Затем исполняемый файл генерирует текстовый файл с результатами программы.

Процесс может быть запущен, однако полученный текстовый файл не создается. Также, когда я проверил вывод приложения, подсказка сообщения («Введите файл») - единственная вещь, хранящаяся в строке, и она не включает в себя вторичную подсказку для оптимального решения («Хотите найти самое оптимальное решение? "). Кто-нибудь может дать мне представление о том, почему это происходит? Спасибо.

Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.Start();        
//input file                
exeProcess.StandardInput.WriteLine(Path.GetFileName(filePath));            
//find optimal solution
exeProcess.StandardInput.WriteLine("Y");
string output = exeProcess.StandardOutput.ReadToEnd();            
exeProcess.WaitForExit();

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Я предполагаю, что эта строка выполняется (и возвращается) до того, как процесс FORTRAN даже сможет прочитать ввод:

string output = exeProcess.StandardOutput.ReadToEnd();

Я не уверен на 100%, каков результат ReadToEnd();на неограниченном потоке в этом случае.Правильный способ сделать это, как упомянуто Джоном Скитом здесь , состоит в том, чтобы читать из stdout в другом потоке или, что еще лучше, асинхронно, как описано здесь: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx

Для потомков:пример:

var outputReader = new Thread(ReadOutput);
outputReader.Start(exeProcess);

где ReadOutput определяется примерно так:

public void ReadOutput(Object processState) {
    var process = processState as Process;
    if (process == null) return;
    var output = exeProcess.StandardOutput.ReadToEnd();
    // Do whetever with output
}

Создание вашего начального метода:

Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.Start();        
//input file                
exeProcess.StandardInput.WriteLine(Path.GetFileName(filePath));            
//find optimal solution
exeProcess.StandardInput.WriteLine("Y");
var outputReader = new Thread(ReadOutput);
outputReader.Start(exeProcess);
exeProcess.WaitForExit();
outputReader.Join();
0 голосов
/ 21 февраля 2012

Сложно сказать, но я предполагаю , что вам нужно передать аргументы в исполняемый файл, например,

Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.StartInfo.Arguments = Path.GetFileName(filePath); //pass file path to EXE
exeProcess.Start();

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...