Я искал везде, но я просто не могу найти правильный ответ.Как писать и читать в процессе без использования useshellexecute = false
Я использую VS2013> C#> Windows Forms-приложений
Ниже вы видите рабочую версию моего процесса. Но у меня есть две небольшие проблемы, которые я не знаю, как исправить.
* .exe - это алгоритм оптимизации, который отображает каждую итерацию, которую он делает, и текущее лучшее решение, которое он нашел. -> но из-за того, что у меня есть «usehellexecute = false», я ничего не вижу в командной оболочке
Пользователь может в любой момент перехватить алгоритм, нажав «Ctrl + C», и алгоритм остановится и вернется в настоящее время лучшим решением -> а потому, что у меня есть «useshellexecute = ложь» Я не могу Imput любые ключевые команды
Как я могу это исправить ?? - Мне нужно увидеть взаимосвязи и нажать «Ctrl + C». - Это не должно быть в командной оболочке, я бы схожу с альтернативным «интерфейсом». - Если я устанавливаю 'useshellexecute = true', как я могу вводить команды и читать все строки.
Обратите внимание:
P.StartInfo.Arguments
для ввода команды не работает. * .exe приведет к ошибке «invalite input».
код, который работает:
private void btn_Optimize_Start_Click(object sender, EventArgs e)
{
Process P = new Process();
P.StartInfo.FileName = @Application.StartupPath + @"\Algorithm.exe";
P.StartInfo.UseShellExecute = false;
P.StartInfo.RedirectStandardInput = true;
P.StartInfo.RedirectStandardOutput = true;
P.StartInfo.RedirectStandardError = true;
P.Start();
//sets timelimit 30 min
P.StandardInput.WriteLine("set lim tim 1800");
//reads the modell for which an optimal solution has to be found
P.StandardInput.WriteLine("read modell.zpl");
//command that starts the optimization algorithm
P.StandardInput.WriteLine("optimize"); //this part can take hours
//command that displays the solution
P.StandardInput.WriteLine("display solution");
//ends the *.exe
P.StandardInput.WriteLine("quit");
//saves all information in a log-file with which I can work
string[] log = P.StandardOutput.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
//opens a function, that formats the solution
this.result_create(log);
}
редактировать 11.11.2014/Каскадный процесс/выход в RichTextBox:
private void btn_Optimize_Start_Click(object sender, EventArgs e)
{
Process P = new Process();
P.StartInfo.FileName = @Application.StartupPath + @"\Algorithm.exe";
P.StartInfo.UseShellExecute = false;
P.StartInfo.RedirectStandardInput = true;
P.StartInfo.RedirectStandardOutput = true;
P.StartInfo.RedirectStandardError = true;
//*** NEW *** Event Handler for the asynchron Output-Process
P.OutputDataReceived += new DataReceivedEventHandler(this.Asyn_Process);
P.Start();
//*** NEW *** Starts asynchron Output-Process
P.BeginOutputReadLine();
//sets timelimit 30 min
P.StandardInput.WriteLine("set lim tim 1800");
//reads the modell for which an optimal solution has to be found
P.StandardInput.WriteLine("read modell.zpl");
//command that starts the optimization algorithm
P.StandardInput.WriteLine("optimize"); //this part can take hours
//command that displays the solution
P.StandardInput.WriteLine("display solution");
//ends the *.exe
P.StandardInput.WriteLine("quit");
//*** DELETED ***
//saves all information in a log-file with which I can work
//string[] log = P.StandardOutput.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
//opens a function, that formats the solution
//this.result_create(log);
}
//*** NEW *** The asynchronous Process
private void Asyn_Process(object sender, DataReceivedEventArgs e)
{
if (this.rTB_Log.InvokeRequired && e.Data != null)
{
//Anonym Invoke Function
this.rTB_Log.Invoke(new MethodInvoker(delegate()
{
//Writes Output continuously in the RichTextBox
this.rTB_Log.Text += e.Data + Environment.NewLine;
//Scroll to End of RichTextBox continuously
this.rTB_Log.SelectionStart = this.rTB_Log.Text.Length;
this.rTB_Log.ScrollToCaret();
}));
}
//When the process has finished (e.Data == null)
else
{
//Anonym Invoke Function
this.rTB_Log.Invoke(new MethodInvoker(delegate()
{
//Saves the RichTextBox-Content in a Text-File
this.rTB_Log.SaveFile(Algorithm.log", RichTextBoxStreamType.PlainText);
}));
}
}
Избавьтесь от 'InvokeRequired'. Это не ошибка вызова 'Invoke', когда вам это не нужно, и было бы ошибкой пропустить эту логику. –