2014-10-13 2 views
-1

Так им написать программу, которая запускает некоторые исполняемые файлы из близлежащих каталогов, и одна из его целей является сохранить эти исполняемые файлы в живых, так что я сделал следующее:Как сохранить процесс живой в Visual C++

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 
Environment::CurrentDirectory = somedir; 
Process::Start("some.exe"); 
Environment::CurrentDirectory = "../"; 
} 

Цель этой кнопки - начать процесс, some.exe, а затем я использую таймер , активированный checkbox, чтобы начать проверять, жив ли этот процесс или нет, и запустить его, если нет. Я использую флажок, чтобы эта функция была опциональной. Таким образом, код таймер выглядит следующим образом:

//this timer is triggered using a checkbox. 
private: System::Void timer_Tick(System::Object^ sender, System::EventArgs^ e) { 
if() //Im stuck here,.. 
{ 
/*and here is stuff i do if the above 'if' statement 
says the program is no longer running. In this case, 
I rerun the executable.*/ 
Environment::CurrentDirectory = somedir; 
Process::Start("some.exe"); 
Environment::CurrentDirectory = "../"; 
} 
} 

и им застрял здесь, я искал вокруг и нашел методы, такие как WaitForSingleObject() или OpenProcess + GetExitCodeProcess, но я не мог понять, каким образом они быть реализованы.

Теперь, что мне нужно сделать, это использовать оператор , если вы хотите проверить, жив ли он или нет, и что-то сделать, в этом случае запустите его снова. Я использую таймер , чтобы повторить проверку каждые 5 секунд.

Прошу прощения, если этот вопрос кажется слишком нуб-иш *, но я действительно борется с этим, и главная причина этого заключается в том, что я в зависимости от примеров, которые я нашел, чтобы узнать код и не знаю, источник для изучения этого языка от a до z, правильно. Чтобы быть более точным, я не знаю, что именно ищет. Некоторая помощь здесь будет очень оценена.

ответ

1

Я считаю, что вы хотите Process::HasExited

private: Process^ proc; 

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    Environment::CurrentDirectory = somedir; 
    this->proc = Process::Start("some.exe"); 
    Environment::CurrentDirectory = "../"; 
} 

private: System::Void timer_Tick(System::Object^ sender, System::EventArgs^ e) 
{ 
    if (this->proc->HasExited) 
    { 
     Environment::CurrentDirectory = somedir; 
     this->proc = Process::Start("some.exe"); 
     Environment::CurrentDirectory = "../"; 
    } 
} 

Другие ноты:

  • У вас есть общий код между этими двумя методами. Наличие вспомогательного метода StartSomeDotExe() имеет смысл.
  • Сомневаюсь, что вы хотите запустить вторую копию Some.exe, если она уже запущена. Поэтому я бы переключил вспомогательный метод на StartSomeDotExeIfNeeded() и назовем это из обоих обработчиков событий.
  • Вам не нужно менять рабочий каталог приложения для запуска этого другого приложения из этого каталога. Вы можете использовать ProcessStartInfo для установки рабочего каталога нового процесса.
  • Вы можете полностью отказаться от таймера и использовать событие Process::Exited. Подпишитесь на это событие, прежде чем вы начнете процесс, и вы будете вызваны, как только процесс завершится.
+0

См. Вышеприведенное сообщение, я исправил пару опечаток после моего первоначального сообщения: '.HasExited' должен быть' -> HasExited', потому что 'Process' является ссылочным типом, а не типом значения. По той же причине 'proc' должен быть объявлен как' Process^', с'^'. –

+0

это работает как шарм, большое спасибо, ВЫ УДИВИТЕЛЬНЫ :) –

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