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
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;
}
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.
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.
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 continuoldMain()
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;
}
- 1. Exigences de diffusion en continu H.264
- 2. Visionneuse de journal en continu (txt)
- 3. en continu XML sérialisation en .net
- 4. sqlnclir.rll en cours de chargement et de déchargement en continu
- 5. comment exécuter une procédure stockée en continu?
- 6. Diffusion vidéo en continu sur Blackberry
- 7. ASP.net flux de réponse continu
- 8. ASP.NET Apprentissage continu
- 9. Comment représenter graphiquement des données en continu en C#
- 10. Configuration de la diffusion multimédia en continu hors site
- 11. Exécution différée en C#
- 12. Transfert en continu + netTcpBinding = le mode cadrage n'est pas supporté?
- 13. Créer une matrice tampon pour les mesures en continu
- 14. Communication interprocessus en PHP avec un processus continu?
- 15. Client Web pour la diffusion vidéo en continu
- 16. Exécution de l'application en cours d'exécution
- 17. Exécution de shell asynchrone en PHP
- 18. exécution * binaires nix en Python
- 19. Comment faire un défilement continu avec JQuery?
- 20. Profilage continu de la bibliothèque linux à l'échelle du système
- 21. C# - Comment lire un flux continu de XML sur HTTP
- 22. Exécution de scripts de base de données en C#
- 23. MarkItUp! actualisation de l'aperçu continu sans appuyer sur Entrée
- 24. Exécution périodique d'une fonction en protocole tordu
- 25. package SSIS exécution en utilisant l'utilitaire dtexec
- 26. Exécution du format .NET en plein écran
- 27. Exécution des shells CakePHP en arrière-plan
- 28. erreur script shell exécution en PHP
- 29. WPF Dispatcher et exécution en arrière-plan
- 30. Lecture audio en continu avec Flash/Actionscript 3 - Problème de lecture lente