2015-09-30 2 views
1

Я недавно добрался до точки, где мне пришлось иметь дело с некоторой логикой в ​​проекте на 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, но при этом продолжайте следить за другими процессами.

Теперь проблема заключается в том, что я не могу найти лучшее решение, которое будет поддерживать мою консольную программу все время и делать эти проверки. Более того, фактическая реализация, которую я нашел до сих пор, не относится ко всем этим ситуациям.

Любые советы по этому вопросу, пожалуйста (усовершенствования логики, критики, альтернативы)? (извините за длинный пост и возможные грамматические ошибки).

+0

К сожалению, ждать, в чем проблема? Является ли это просто запросом на проверку кода? Если да, то это вне темы. –

+0

Какова цель любого из goto, кроме последнего? Не так ли получилось? –

+0

@DavidSchwartz Я был просто пытаясь избежать случая, когда я закрываю 'app1', и он сразу же открывает его после этого. Он должен продолжать поиск процесса, пока он не появится. –

ответ

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, он проверяет каждый процесс на каждой итерации.

EDIT:

Из комментариев кажется, что вы только хотите, чтобы запустить функцию один раз. Для этого мы можем добавить 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 ложно, то мы будем проверять, если процесс запущен, и если мы запускаем fun1() затем установите procX истину. В противном случае, если procX истинно, остальная часть оператора if пропускается.

+0

Спасибо @NathanOliver. Это фиксировало этот конкретный случай. В любом случае, ther e также следующая ситуация: если 'process1.exe' запущен, и я пытаюсь открыть второй процесс, это не сработает. Я имею в виду, что он не закрывает и не возобновляет второй процесс. Любые изменения для этого тоже? –

+0

@Alexander Возможно, вы захотите задать новый вопрос. Вы можете вернуться к этому вопросу, чтобы показать, с чего вы начали. – NathanOliver

+0

Я сделал: http://stackoverflow.com/questions/32868136/unsuccesfull-management-of-specific-processes-in-my-c-console-application –

0

Как насчет карты из String в String, в которой ключ является одной строкой для имени процесса, а значением является файл .bat для запуска? Он будет выглядеть элегантно и масштабируемо.

std::map - твой друг! http://www.cplusplus.com/reference/map/map/

При том, что вы можете использовать один и тот же while, как и другие ответы, но если только один (или с помощью всего лишь пару if с, даже если вы получили bazillion возможностей.

Смежные вопросы