对我的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文件并执行它(killprocess2
(它可能在我打开它之前存在),再次启动>它,删除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(...)
重命名为更有意义的东西。