对我的C ++控制台应用程序中的特定进程进行不一致的管理

在这个post中,我解决了部分案例,感谢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 (它可能在我打开它之前存在),再次启动>它,删除fun2(const char name[]){}生成的.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); } 

其余function完全相同。

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

这个怎么样? (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比较第一个表达式proc然后比较ProcessRunning(...) 。 为了进入控制块,两者都必须为真。

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

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

PD:我也会将fun1(...)重命名为更有意义的东西。