我最近遇到了一个必须处理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;
}
现在我希望整个程序能做什么:
process1
(第一个if),它会创建该.bat文件并执行它(终止第一个进程,再次启动它,删除.bat
文件)。
该流程现在正在运行,但该程序仍应通过其他if
并检查是否有process2
,process3
或process4
正在运行并执行他们也一样。每个流程都分配给一个应用程序,让我们说:
app1 - >跟process1
一样
app2 - >跟process2
一样
..
app4 - >与process4
案例:
process1
,但这应该适用于所有人。因为应用程序始终在运行,所以它会检查是否有进程1。如果没有,则检查process2,如果没有找到,则重新开始。否则,如果找到了process1,请执行if
条件中的操作,但仍然会处理其他进程。
现在,我遇到的问题是我无法找到更好的解决方案,这将使我的控制台程序始终运行并进行这些检查。更多,到目前为止我发现的实际实施并没有对所有这些情况进行处理。
有关此问题的任何建议(逻辑,批评,替代方案的改进)? (抱歉长篇文章和可能的语法错误)。
答案 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
,即使你有很多可能性。