2009-02-27 7 views
3

Quelle est la manière la plus intelligente d'exécuter une application de manière continue afin qu'elle ne sorte pas après qu'elle a atteint le fond? Au lieu de cela, il recommence depuis le haut de la main et ne sort que lorsqu'il est commandé. (Ceci est en C)Exécution de l'application en continu

Répondre

10

Vous devriez toujours avoir un moyen de sortir proprement. Je suggère de déplacer le code à une autre fonction qui renvoie un drapeau pour dire si vous voulez sortir ou non.

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; 
} 
2
while (true) 
{ 
.... 
} 

Pour développer un peu plus, vous voulez mettre quelque chose dans cette boucle qui vous permet de laisser l'utilisateur faire des actions répétées. Que ce soit en lisant les frappes de touches et en effectuant des actions basées sur les touches enfoncées, ou en lisant les données du socket et en renvoyant une réponse.

4

La plupart des applications qui ne tombent pas dans l'erreur entrent dans une sorte de boucle de traitement d'événements qui permet la programmation par événement. Sous le développement de Win32, par exemple, vous écrivez votre WinMain fonction pour traiter continuellement de nouveaux messages jusqu'à ce qu'il reçoive le message WM_QUIT indiquant à l'application de terminer. Ce code prend généralement la forme suivante:

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

Si vous écrivez un jeu en utilisant SDL, vous le feriez en boucle sur les événements SDL jusqu'à décider de quitter, par exemple lorsque vous constatez que l'utilisateur a appuyez sur la touche Echap. Code pour faire cela pourrait ressembler à ceci:

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; 
     } 
    } 
} 

Vous pouvez également lire sur Unix Daemons et Windows Services.

1

Il existe un certain nombre de façons de «commander» à votre application de quitter (comme un indicateur de sortie global ou des codes de retour). Certains ont déjà abordé l'utilisation d'un code de sortie, donc je vais proposer une modification facile à apporter à un programme existant en utilisant un drapeau de sortie.

Supposons que votre programme exécute un appel système pour produire une liste de répertoires (répertoire complet ou un seul fichier):

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); 
    } 
} 

Comment allons-nous faire cette boucle jusqu'à ce qu'une condition de sortie. Les étapes suivantes sont prises:

  • changement main()-oldMain().
  • Ajouter nouveau exitFlag.
  • Ajoutez le nouveau main() pour appeler en continu oldMain() jusqu'à la sortie signalée.
  • Modifiez oldMain() pour signaler la sortie à un moment donné.

Cela donne le code suivant:

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; 
} 
Questions connexes