Запустите приложение непрерывно - PullRequest
3 голосов
/ 27 февраля 2009

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

Ответы [ 4 ]

10 голосов
/ 27 февраля 2009

У вас всегда должен быть какой-то способ чистого выхода. Я бы предложил перенести код в другую функцию, которая возвращает флаг, чтобы сказать, выходить или нет.

int main(int argc, char*argv[])
{

     // param parsing, init code

     while (DoStuff());

    // cleanup code
    return 0;
 }

 int DoStuff(void)
 {
     // code that you would have had in main

     if (we_should_exit)
         return 0;

     return 1;
 }
4 голосов
/ 27 февраля 2009

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

Например, при разработке для Win32 вы должны написать свою функцию WinMain для постоянной обработки новых сообщений до тех пор, пока она не получит сообщение WM_QUIT, сообщающее приложению о завершении. Этот код обычно принимает следующую форму:

// ...meanwhile, somewhere inside WinMain()
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
     TranslateMessage(&msg);
     DispatchMessage(&msg);
}

Если вы пишете игру, используя SDL , вы будете зацикливаться на событиях SDL до тех пор, пока не решите выйти, например, когда вы обнаружите, что пользователь нажал клавишу Esc. Некоторый код для этого может выглядеть следующим образом:

bool done = false;
while (!done)
{
    SDL_Event event;
    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                done = true;
                break;
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_ESCAPE)
                {
                    done = true;
                }
                break;
        }
    }
}

Вы также можете прочитать о Демонах Unix и Службы Windows .

2 голосов
/ 27 февраля 2009
while (true)
{
....
}

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

1 голос
/ 27 февраля 2009

Существует несколько способов «подать» команду на выход из вашего приложения (например, глобальный флаг выхода или коды возврата). Некоторые уже затронули вопрос использования кода выхода, поэтому я предложу легко изменить существующую программу, используя флаг выхода.

Предположим, что ваша программа выполняет системный вызов для вывода списка каталогов (полный каталог или один файл):

int main (int argCount, char *argValue[]) {
    char *cmdLine;
    if (argCount < 2) {
        system ("ls");
    } else {
        cmdLine = malloc (strlen (argValue[1]) + 4);
        sprintf (cmdLine, "ls %s", argValue[1]);
        system (cmdLine);
    }
}

Как нам сделать этот цикл до состояния выхода. Предпринимаются следующие шаги:

  • Изменить main() на oldMain().
  • Добавить новый exitFlag.
  • Добавить новый main() для непрерывного вызова oldMain(), пока выход не помечен.
  • Заменить oldMain() на сигнал выхода в какой-то момент.

Это дает следующий код:

static int exitFlag = 0;

int main (int argCount, char *argValue[]) {
    int retVal = 0;

    while (!exitFlag) {
        retVal = oldMain (argCount, argValue);
    }

    return retVal;
}

static int oldMain (int argCount, char *argValue[]) {
    char *cmdLine;
    if (argCount < 2) {
        system ("ls");
    } else {
        cmdLine = malloc (strlen (argValue[1]) + 4);
        sprintf (cmdLine, "ls %s", argValue[1]);
        system (cmdLine);
    }

    if (someCondition)
        exitFlag = 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...