在我的C ++控制台应用程序中对特定进程进行Unsuccesfull管理

时间:2015-09-30 14:02:16

标签: c++ c

在此thread我解决了部分案例,感谢NathanOliver,到目前为止,我已经完成了以下代码:

int main(){
    //...
    bool proc1 = false, proc2 = false, proc3 = false, proc4 = false,
    while(true) {
        if(!proc1 && ProcessRunning("process1.exe")){
            fun1("fun1.bat");
            proc1  = true;
        }
        if(!proc2 && ProcessRunning("process2.exe")){
            fun1("fun2.bat");
            proc2  = true;
        }
        if(!proc3 && ProcessRunning("process3.exe")){
            fun1("fun3.bat");
            proc3  = true;
        }
        if(!proc4 && ProcessRunning("process4.exe")){
            fun1("fun4.bat");
            proc4  = true;
        }
    }
    return 0;
}

我仍然可以通过以下情况:

  • 双击app1 - > process1开始。
  • process1正在运行时,我双击app2,以便process2应该具有我在第一个帖子中提到的相同行为:
  

如果找到process2(第二个if(){}),则会创建该.bat文件   它执行它(kill process2(它可能在我打开它之前存在),再次启动>它删除.bat生成的fun2(const char name[]){}文件。

上一篇文章摘要:

int fun1(const char name[]){
    ofstream file;
    file.open(name, ios::out);
    //start of what I write in .bat
    file << "@echo off";    
    file << "cd to specific path";
    file << "taskkill  /im process.exe* /f";
    file << "start process.exe";
    file << "del \"%~f0\"";

    file.close();
    return system(name);
}

其余功能完全相同。

2 个答案:

答案 0 :(得分:1)

我相信您将.bat文件作为同步程序运行,因此直到蝙蝠不能完成并返回退出代码(您可以将其检查为系统功能的返回值),您的主程序将不会继续跑步。您可以在基于Linux的系统上使用fork并在Windows操作系统上使用CreateProcess来使用异步进程。

答案 1 :(得分:0)

这个怎么样? (C ++ 11标准)

    bool proc[] = {false, false, false, false};

    while(true) 
    {
      for(int i=0 ; i<4 ; i++)
      {
        const std::string exeName = "process" + std::to_string(i) +  ".exe";            
        const std::string funName = "fun" + std::to_string(i) +  ".bat";            

        if(!proc[i] && ProcessRunning(exeName.c_str()))
        {
           fun1(funName.c_str());
           proc[i]  = true;
        }
    }

应该让事情变得更灵活,但要解决你的问题。 If-condition将第一个表达式procProcessRunning(...)进行比较。为了进入控制块,两者都必须为真。

但是您的文件解释fun1()似乎至少在评论中存在问题。例如,您提到//taskkill process.exe,但必须是process#

如果您提供完整的fun1实施或至少最相关的部分,我可以为您提供更多帮助。你的周期应该有效。问题必须在fun1(...)

P.D。:我还会将fun1(...)重命名为更有意义的内容。