2009-06-11 5 views
1

У меня есть процесс, я могу начать и скрыть работу отлично, но я хочу читать из консольной программы, когда я запускаю, а не после, я пытался запустить таймер, anbd читать на галочке , но моя программа просто падает, а когда этого не происходит, я ничего не получаю.Чтение с консольного процесса

  startInfo= new ProcessStartInfo("cmd.exe"); 
      startInfo.Arguments ="/C uus.exe "+ arg.ToString(); 
      startInfo.RedirectStandardError = true; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.UseShellExecute = false; 
      startInfo.CreateNoWindow = true; 
      this.timer1.Enabled=true; 
      this.listBox1.Items.Clear(); 
      p= Process.Start(startInfo); 
          Application.DoEvents(); 

     void Timer1Tick(object sender, EventArgs e) 
    { 
     string str=""; 
     str=p.StandardOutput.ReadLine(); 
     if(str != null) 
     { 
      this.Text=str.ToString(); 
      this.listBox1.Items.Add(str); 
     } 
     Application.DoEvents(); 
    } 

Так что же делать, чтобы решить эту проблему?


Update: Я попытался Бендеры предложения теперь моя программа не погубит больше, но и не recvie никаких данных

  proc.StartInfo.UseShellExecute=false; 
      proc.StartInfo.CreateNoWindow=true; 
      proc.StartInfo.RedirectStandardOutput=true; 
      proc.StartInfo.RedirectStandardError=true; 
      proc.StartInfo.FileName="uus.exe"; 
      proc.StartInfo.Arguments=arg; 
      proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(SortOutputHandler); 
      proc.Start(); 
      proc.BeginOutputReadLine(); 

    void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) 
    { 
     string str=""; 
     string str2=""; 
     str=e.Data.ToString(); 
     if(str!=null && str!="") 
     { 
      this.listBox1.Items.Add(str.ToString()); 
      this.Text=str.ToString(); 
     } 
     str2=proc.StandardOutput.ReadLine(); 
     if(str2!=null && str2!="") 
     { 
      this.lsw1.Items.Add(str2.ToString()); 
     } 
    } 

хмм?


Update: Я изменил обработчик, потому что я есть время сказать, он не может это сделать, что Виль крест операции нить, usualyy я Wille есть получаю сообщение об ошибке, если он был.

private delegate void TextAdderDelegate(string str); 

void TextAdder(string str) 
{ 
    if(this.lsw1.InvokeRequired==true) 
    { 
     Invoke(new TextAdderDelegate(TextAdder),new object[] {str}); 
    } 
    else 
    { 
     this.lsw1.Items.Add(str); 
    } 
} 

void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) 
{ 
    string str=""; 

    if(e!=null) 
    { 
     if(e.Data!=null) 
     { 
     str=e.Data.ToString(); 
     } 
    } 
    TextAdder(str); 
} 
+0

Я также попытался запустить процесс напрямую, а не throug cmd. – 2009-06-12 20:56:42

ответ

1

Проблема в том, что вы работаете на одном потоке и пытаетесь писать с использованием другого. Когда вы создаете фоновый поток, используя событие ticker Timer, он не может иметь входной интерфейс пользователя.

Возможно, если вы объясните общую картину того, что вы пытаетесь достичь, мы можем вам помочь.

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

+0

. Программа - это процесс, который принимает некоторые аргументы, и если ни один запуск erro не запускается и не закрывается, что я пытаюсь сделать, это запустить процесс , прочитайте, как долго процесс выполняется с задачей, в то время как он выполняет задачу не после, и записывает ее в мою программу. >> В то же время вам может понадобиться однопоточность, избегая отметки таймера и чтения в том же процессе. Вы имеете в виду, что я должен попытаться прочитать в функции, где я называю процесс? – 2009-06-11 15:38:27

0

Вы можете создать экземпляр процесса явно (например, new Process) и использовать OutputDataReceived событие, метод BeginOutputReadLine() и, когда закончил CancelOutputRead() для этого.

Событие OutputDataReceived будет повторно вызываться асинхронно из другой темы, так как скоро будут доступны выходные данные.

+0

Я попробовал решение, как обновление в вопросе, теперь он не сбой, но и я вообще не получаю никаких данных, также я не мог понять, где разместить CancelOutputRead(). – 2009-06-12 21:24:30

0

Я предполагаю, что вы получаете «исключение перекрестной резьбы», это может быть вызвано тем, что вы обновляете элементы управления формы в другом потоке, а затем в потоке пользовательского интерфейса.

+0

нет, нет сообщения об ошибке на al. – 2009-06-11 17:42:08