如何在Visual C ++中保持进程的活跃性

时间:2014-10-13 23:08:45

标签: visual-c++ c++-cli

所以我正在编写一个程序,从附近的目录启动一些可执行文件,其目标之一是保持这些可执行文件存活,所以我做了以下内容:

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学习这种语言的适当来源。更准确地说,我不知道我正在寻找什么。这里的一些帮助将非常感激。

1 个答案:

答案 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事件。在开始流程之前订阅该事件,并在流程退出后立即调用。