Я недавно добрался до точки, где мне пришлось иметь дело с некоторой логикой в проекте на C++, и, к сожалению, я не смог сделать это правильно, используя goto
.Альтернативы goto в моем консольном приложении C++
В чем проблема?
У меня есть одна функция, названная 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
(первый, если), он создает что .bat файл и он выполняет его (убейте первый процесс, запустите его снова, удалите файл.bat
). Процесс теперь запущен, но программа должна по-прежнему проходить через другойif
s и проверить, есть лиprocess2
,process3
илиprocess4
бега и сделать то же самое для них.
Каждый процесс назначается приложения, скажем:
app1 -> идет с process1
app2 -> идет с process2
..
App4 -> идет с process4
Случаи:
- process1 i ы работает
- process1 не работает
.. - и так далее
Ради примера я просто возьмуprocess1
, но это должно относиться ко всем из них.
Поскольку приложение всегда работает, оно проверяет, есть ли процесс1. Если этого не происходит, он проверяет процесс2, и если ни один не найден, начните снова и снова. В противном случае, если процесс 1 найден, выполните то, что находится в этом состоянии if
, но при этом продолжайте следить за другими процессами.
Теперь проблема заключается в том, что я не могу найти лучшее решение, которое будет поддерживать мою консольную программу все время и делать эти проверки. Более того, фактическая реализация, которую я нашел до сих пор, не относится ко всем этим ситуациям.
Любые советы по этому вопросу, пожалуйста (усовершенствования логики, критики, альтернативы)? (извините за длинный пост и возможные грамматические ошибки).
К сожалению, ждать, в чем проблема? Является ли это просто запросом на проверку кода? Если да, то это вне темы. –
Какова цель любого из goto, кроме последнего? Не так ли получилось? –
@DavidSchwartz Я был просто пытаясь избежать случая, когда я закрываю 'app1', и он сразу же открывает его после этого. Он должен продолжать поиск процесса, пока он не появится. –