我的C++;控制台应用程序 我最近遇到了一个问题,我必须处理C++项目中的一些逻辑问题,不幸的是我不能用 Goto < /C> >做正确的处理。

我的C++;控制台应用程序 我最近遇到了一个问题,我必须处理C++项目中的一些逻辑问题,不幸的是我不能用 Goto < /C> >做正确的处理。,c++,c,C++,C,问题出在哪里 我有一个名为ProcessRunning(const char*name)的函数,它验证进程是否存在(它返回true)或不存在(它返回false) 我还有另外4个函数,intfun1(constcharname[]),intfun2(constcharname[]),intfun3(constcharname[]),intfun4(constcharname[])。 -这些函数中的每个函数如下所示: int fun1(const char name[]){ //open a

问题出在哪里

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

我还有另外4个函数,
intfun1(constcharname[])
intfun2(constcharname[])
intfun3(constcharname[])
intfun4(constcharname[])
。 -这些函数中的每个函数如下所示:

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
    s,检查是否有
    process2
    process3
    process4
    正在运行,并对它们执行相同的操作
每个进程都分配给一个应用程序,例如:

app1->与流程1一起使用 app2->与流程2一起使用 ..
app4->与
process4一起使用

案例:

  • 进程1正在运行
  • 进程1未运行
    ..
  • 等等
    为了举例说明,我将只采用
    process1
    ,但这应该适用于所有这些流程
因为应用程序总是在运行,所以它会检查是否有process1。如果没有,它将检查process2,如果没有找到,则重新开始。否则,如果找到了进程1,则执行该
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
,因为如果找到一个进程,我们将永远不会检查另一个进程。只要使用
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
为true,则跳过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
,因为如果找到一个进程,我们将永远不会检查另一个进程。只要使用
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
为true,则跳过if语句的其余部分。

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

std::map
是你的朋友!


这样,您就可以使用与其他答案相同的
while
,但如果只有一个答案的话(或者如果
s,即使你得到了无数的可能性,也只需要几个

从一个字符串到另一个字符串的映射,其中键是一个字符串表示进程的名称,值是要运行的.bat文件。它看起来优雅且可伸缩

std::map
是你的朋友!


这样,您就可以使用与其他答案相同的
while
,但如果只有一个答案的话(或者只要几个
if
s,即使你有无数的可能性。

对不起,等等,问题出在哪里?这只是一个代码审查请求吗?如果是的话,那就离题了。除了最后一个goto之外,任何一个goto的目的是什么?这不会发生吗?@DavidSchwartz我只是想避免我关闭的案例e> app1
然后它会立即重新打开它。它会一直寻找一个进程直到它出现抱歉,等等,问题出在哪里?这只是一个代码审查请求吗?如果是的话,它就离题了。除了上一个,任何goto的目的是什么?这不会发生吗?@DavidSchwartz我只是想避免这个案例我关闭了app1,然后它立即重新打开。它将继续寻找一个进程,直到它出现。谢谢@NathanOliver。这修复了那个特定的情况。无论如何,还有下一种情况:如果
进程