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

时间:2015-09-30 12:37:16

标签: c++ c

我最近遇到了一个必须处理C ++项目中某些逻辑的问题,遗憾的是我无法使用goto做到这一点。

有什么问题?

我有一个名为ProcessRunning(const char *name)的函数,用于验证进程是否存在(它返回true)与否(它返回false)。

我还有另外4个功能,int fun1(const char name[])int fun2(const char name[])int fun3(const char name[])int fun4(const char name[])。   - 这些功能中的每一个都是这样的:

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个功能完全相同。

现在,在我的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文件并执行它(终止第一个进程,再次启动它,删除.bat文件)。 该流程现在正在运行,但该程序仍应通过其他if并检查是否有process2process3process4正在运行并执行他们也一样。

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

app1 - >跟process1一样 app2 - >跟process2一样 ..
app4 - >与process4

一起使用

案例:

  • process1正在运行
  • process1未运行
    ..
  • 等等 举例来说,我只需要process1,但这应该适用于所有人。

因为应用程序始终在运行,所以它会检查是否有进程1。如果没有,则检查process2,如果没有找到,则重新开始。否则,如果找到了process1,请执行if条件中的操作,但仍然会处理其他进程。

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

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

2 个答案:

答案 0 :(得分:7)

如果你想检查每个循环的每个进程的存在而你想要永远运行,你可以使用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,因为如果找到一个进程,我们永远不会检查另一个进程。仅使用if,它将在每次迭代时检查每个进程。

编辑:

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

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为真,则跳过if语句的其余部分。

答案 1 :(得分:0)

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

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

有了这个,你可以使用与其他答案相同的while,但如果只有一个(或仅仅是几个if,即使你有很多可能性。