我的C ++控制台应用程序中goto的替代方案

我最近遇到了一个问题,我不得不在C ++项目中处理一些逻辑,不幸的是我无法使用goto做到这一点。

问题是什么?

我有一个名为ProcessRunning(const char *name)函数,它validation进程是否存在(它返回true )或不validation(它返回false )。

我有另外4个函数, int fun1(const char name[])int fun2(const char name[])int fun3(const char name[])int fun4(const char name[]) 。 – 这些function中的每一个都是这样的:

 int fun1(const char name[]){ //open a new .bat file //start of what I write in .bat //taskkill process.exe //start again process.exe //delete the created file //end of what I write in the file return system(name); } 

其他3个function完全相同。

现在,在我的main()程序中,我尝试执行以下操作:

 int main(){ //... start_again: if(ProcessRunning("process1.exe")){ fun1("fun1.bat"); goto start_again; } else if(ProcessRunning("process2.exe")){ fun1("fun2.bat"); goto start_again; } else if(ProcessRunning("process3.exe")){ fun1("fun3.bat"); goto start_again; } else if(ProcessRunning("process4.exe")){ fun1("fun4.bat"); goto start_again; } else if(!ProcessRunning("process1.exe") || !ProcessRunning("process2.exe") || !ProcessRunning("process3.exe") || !ProcessRunning("process4.exe") || ){ goto start_again; } goto start_again; return 0; } 

现在我希望整个程序要做什么:

  • 程序必须始终运行;
  • 它检查这4个进程中的一个是否正在运行;
  • 如果没有这样的过程,请返回并再次检查(因此,如果不满足任何条件,则进行永久性检查)
  • 如果它找到process1 (第一个if),它会创建该.bat文件并执行它( process1第一个进程,再次启动它,删除.bat文件)。 该进程现在正在运行,但程序仍然应该通过另一个process3 ,并检查是否有process4process4process4正在运行并为它们执行相同的操作。

每个进程都分配给一个应用程序,让我们说:

app1 – >与process1一起使用
app2 – >与process2一起使用
..
app4 – >与process4一起使用

案例:

  • process1正在运行
  • process1未运行
    ..
  • 等等
    为了举例,我将采用process1但这应该适用于所有这些。

由于应用程序始终在运行,因此会检查是否存在process1。 如果没有,则检查process2,如果没有找到,则重新开始。 否则,如果找到了process1,那么在if条件下执行什么操作,但仍然会查看其他进程。

现在,我遇到的问题是我找不到更好的解决方案,这将使我的控制台程序一直运行并进行这些检查。 更多,到目前为止我发现的实际实现并没有处理所有这些情况。

有关此问题的任何建议(逻辑,批评,替代方案的改进)? (对不起长篇文章和可能的语法错误)。

如果你想检查每个循环的每个进程的存在而你想要永远运行,你可以使用while循环。

 int main(){ //... while(true) { if(ProcessRunning("process1.exe")){ fun1("fun1.bat"); } if(ProcessRunning("process2.exe")){ fun1("fun2.bat"); } if(ProcessRunning("process3.exe")){ fun1("fun3.bat"); } if(ProcessRunning("process4.exe")){ fun1("fun4.bat"); } } return 0; } 

else if在这里我们不想使用else if ,因为如果找到一个进程,我们永远不会检查另一个进程。 使用它只会检查每次迭代的每个进程。

编辑:

从评论看来,您只想运行一次function。 为此,我们可以为每个进程添加一个bool,并在if条件中检查它。 如果是真的那么我们将不再运行该function。 为此,我们可以将代码更改为:

 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; } 

现在如果procX为false,那么我们将检查进程是否正在运行,如果是,我们运行fun1()然后将procX设置为true。 否则,如果procX为true,则跳过if语句的其余部分。

从String到String的映射怎么样,其中键是进程名称的一个字符串,值是要运行的.bat文件? 它看起来优雅且可扩展。

std::map是你的朋友! http://www.cplusplus.com/reference/map/map/

有了它,你可以和其他答案一样使用同样的东西,但如果只有一个(或者只是几个if ,即使你有很多可能性)。