所以我正在编写一个程序,从附近的目录启动一些可执行文件,其目标之一是保持这些可执行文件存活,所以我做了以下内容:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Environment::CurrentDirectory = somedir;
Process::Start("some.exe");
Environment::CurrentDirectory = "../";
}
此按钮的目标是启动此过程, some.exe ,然后我使用由复选框计时器 >以便开始检查进程是否仍然存在,如果没有则启动它。我使用复选框来保持此功能的可选性。所以计时器代码如下:
//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 这样的方法,但我无法理解它们的实现方式。< / p>
现在我需要做的是使用 if 语句检查进程是否存活,并对其执行某些操作,在这种情况下,再次启动它。我使用计时器每5秒重复一次检查。
我很抱歉,如果这个问题看起来太过noob-ish *,但我真的在这里苦苦挣扎,主要原因是我依赖于我找到的例子来学习代码,并且不知道正确地从a到z学习这种语言的适当来源。更准确地说,我不知道我正在寻找什么。这里的一些帮助将非常感激。
答案 0 :(得分: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
事件。在开始流程之前订阅该事件,并在流程退出后立即调用。