在此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;
}
我仍然可以通过以下情况:
process1
开始。process1
正在运行时,我双击app2,以便process2
应该具有我在第一个帖子中提到的相同行为:如果找到
process2
(第二个if(){}
),则会创建该.bat文件 它执行它(killprocess2
(它可能在我打开它之前存在),再次启动>它删除.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);
}
其余功能完全相同。
答案 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将第一个表达式proc
与ProcessRunning(...)
进行比较。为了进入控制块,两者都必须为真。
但是您的文件解释fun1()
似乎至少在评论中存在问题。例如,您提到//taskkill process.exe
,但必须是process#
。
如果您提供完整的fun1
实施或至少最相关的部分,我可以为您提供更多帮助。你的周期应该有效。问题必须在fun1(...)
P.D。:我还会将fun1(...)
重命名为更有意义的内容。