2015-07-22 4 views
0

Я пытаюсь получить pid процесса, когда процесс завершает работу, но еще не убивает.Как я могу получить Process.waitForFinish()

process.WaitForExit(); 

метод выше остановки, пока процесс не будет убит, но я ищу что-то вроде process.waitForFinish, потому что я пытаюсь справиться с процессом, когда она заканчивая работу, но еще не убили.

Как добавить сигнал и перейти в другой процесс. Exemple:

//Process to catch 
main(){ 
    //Do some Code 
    End of the function 
    SendEndSignal(); & Stop(); 
} 

Второй процесс будет поймать первый процесс, как этот

main(){ 
    int pid = Process.start("Process1.exe"); 
    process.waitUntilReceiveSignal(); 
    //Do code here 
    process.kill(); 
} 

мне нужно что-то вроде process.WaitForInputIdle();, но проблема здесь это работает, только если процесс содержит графический интерфейс. Так что, если процесс ждет ввода от пользователя с помощью консоли, как с помощью Console.readLine().

Это означает, что мне нужно знать, когда процесс переходит в неактивное состояние, но не убит.

+0

К сожалению, нет. он использует только process.WaitForExit(); – miloud

+0

К сожалению, если вы не контролируете процесс завершения целевого процесса, нет надежного способа определить, когда процесс завершился, это «работа». – MrPaulch

+0

@MrPaulch вот почему я подумываю о том, чтобы отправлять концы с процесса на процесс, но не знаю, как это сделать. – miloud

ответ

0

EventWaitHandle - это способ пойти в вашем случае.

namespace A 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var evh = new EventWaitHandle(false, EventResetMode.AutoReset,"fromA"); 
      Console.WriteLine("Anykey to send signal"); 
      Console.ReadKey(); 
      evh.Set(); 
     } 
    } 
} 

namespace B 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Waiting for a signal"); 
      var evh = EventWaitHandle.OpenExisting("fromA"); 
      evh.WaitOne(); 
      Console.WriteLine("Signal!"); 
      Console.ReadKey(); 
     } 
    } 
} 

Но имейте в виду, что вам нужно будет ждать, пока дочерний процесс, чтобы зарегистрировать свою EventWaitHandle. Так что вы либо ждете какое-то время (уродливое). Или создать еще один EventWaitHandle в родительском процессе, поэтому дочерний процесс уведомляет, когда его обработчик зарегистрирован

Edit: Комплексное решение

namespace Parent 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var childReadyEh =new EventWaitHandle(false, EventResetMode.AutoReset,"childIsReady")) 
      { 
       Process.Start("child.exe"); 
       childReadyEh.WaitOne(); 
      } 

      using (var childSignalEh =EventWaitHandle.OpenExisting("childSignal")) 
      { 
       childSignalEh.WaitOne(); 
      } 

      Console.WriteLine("Signal is recieved"); 
      Console.ReadKey(); 
     } 
    } 
} 

namespace Child 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      EventWaitHandle childSignalEh =null; 
      using (var childReadyEh =EventWaitHandle.OpenExisting("childIsReady")) 
      { 
       childSignalEh =new EventWaitHandle(false, EventResetMode.AutoReset,"childSignal"); 
       childReadyEh.Set(); 
      } 
      Console.WriteLine("Anykey to send a signal to parent"); 
      Console.ReadKey(); 

      childSignalEh.Set(); 
      childSignalEh.Dispose(); 

      Console.WriteLine("Signal is sent"); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

Это дает мне ошибку В программе B Нет дескриптора данного имени. – miloud

+0

Да, пожалуйста, прочитайте мой отредактированный ответ. В принципе, вам нужно запустить A, затем B. в этом порядке. Насколько я понял, вы определили порядок выполнения, но все равно нужно добавить некоторую синхронизацию там –

+0

Да, вот что я сделал, я запустил B, который он будет запускать A, используя Process.Start(), затем я использую EventWaitHandle.OpenExisting ("fromA «); evh.WaitOne(); но дайте мне ошибку – miloud

Смежные вопросы