Arrêter une boucle infini

Résolu
MirKoRn Messages postés 27 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 octobre 2007 - 13 août 2007 à 16:50
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 16 août 2007 à 08:40
je dois faire une boucle do...while pour mon programme (elle doit mélanger aléatoirement un tableau) et je voudrai contrôler a quel moment elle s'arrête en appuyant sur une touche du clavier.

je pense utilisé l'instruction break mais je ne sais pas comment insérer une condition pour que ça soit moi qui décide a quel moment elle s'arrête! c'est pour mélanger des cartes et pour que cela soit vraiement aléatoire je veux pouvoir décider soit le moment ou la boucle s'arrète soit le nombre de secondes que la boucle fait avant de s'arrêter!

Merci

11 réponses

THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
13 août 2007 à 17:22
Salut

L'algorithme est très simple:

temps1 = GetTemps();    // Où GetTemps() est une fonction de ton choix retournant le temps absolu

Do
[ton code]

temps_écoulé = GetTemps() - temps1;
while( appui sur une touche || temps_écoulé >= nombre_de_secondes_souhaité )
<endl>Un clavier Azerty en vaut deux

</endl>
MirKoRn Messages postés 27 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 octobre 2007
13 août 2007 à 18:09
merci bcp!!!
je vais essayer de m'en sortir  avec ça!! maintenant GO pour le systeme de brassage du tableau!
MirKoRn Messages postés 27 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 octobre 2007
13 août 2007 à 18:15
tu aurais un code comme exemple?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2007 à 18:45
while( non appui sur une touche && temps_écoulé < nombre_de_secondes_souhaité )




_____________________________________
Un éditeur de ressources gratuit pour Windows

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
13 août 2007 à 19:24
roohhh oui désolé moment de fatigue
<endl>Un clavier Azerty en vaut deux

</endl>
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 août 2007 à 12:52
Salut,

Première remarque, un petit Sleep(1) dans la boucle éviterais au processeur de trop se fatiquer.

Deuxième remarque concernant le codage de "appui sur une touche" : C'est le coup classique de l'application qui ne traite plus ses messages. Elles paraît morte, ne se redessine plus, ne réagit plus aux clique sur ces boutons... Bref, une appli qui boucle. Pourquoi ? Car elle ne traite plus les messages qui lui son envoyés par Windows. Bah vi, elle peut pas boucler et traiter les messages en même temps. Une solution serait de créer un thread spécialement pour le "trie" du tableau, et laisser l'autre traiter les messages. Une deuxième solution est de mettre faire un traitement des messages dans ta boucle. A la place de GetMessage, qui est bloquant jusqu'au prochain message, il faut mettre un PeekMessage. Sinon, ça devrait assez ressembler pour le reste : TranslateMessage puis DispatchMessage. Je sais pas comment est traiter la fin de l'execution de l'appli par contre.
Que tu fasses un thread ou un traitement des messages dans ta boucle, les boutons de ton appli deviennent tous utilisables. Cela peut poser problème, par exemple si tu as un bouton "trier". L'utilisateur peut alors cliquer dessus autant qu'il le veut... Il faut alors désactivé les contrôles de l'interface qui peuvent poser problème.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 août 2007 à 18:54
Le Sleep ne ferait que réduires les performances, ce n'et pas ce qu'on veut ici
Après, il n'a jamais dit qu'il travaillait sous Windows, si ca se trouve c'est un programme en mode console, et dans ce cas un thread est inutile.

_____________________________________
Un éditeur de ressources gratuit pour Windows
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 août 2007 à 21:40
Erf, vi il a rien dit.
Bah comment tu aurais fais alors ?
Les fonctions de lecture sur l'entrée standard que je connais (scanf, gets/fgets, getchar...) sont bloquantes si je ne m'abuse.

J'aurais fait ça comme ça (Sous Windows) :

#include <stdio.h>
#include <windows.h>
#include <conio.h>

// Demande la fin du trie
BOOL stop;

DWORD __stdcall TrieTableau()
{
do
{
// Trie du tableau
}
while ( ! stop);
return 0;
}

int main()
{
DWORD id; // id du thread
HANDLE hThread; // Handle du thread

hThread = CreateThread(NULL, 0, TrieTableau, NULL, 0, &id);
printf("Appuyer sur une touche pour stopper le trie\n");
stop = TRUE;
WaitForSingleObject(hThread, INFINITE);
printf("fin du trie\n");
CloseHandle(hThread);
return 0;
}
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 août 2007 à 21:42
Zut j'ai zappé le getch(); avant le stop = TRUE;
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 août 2007 à 22:37
Oui c'est vrai qu'en standard je vois pas comment faire puisque les fonctions sont bloquantes (enfin il y a kbhit mais bon c'est pas terrible).
Donc ok pour ta solution

_____________________________________
Un éditeur de ressources gratuit pour Windows
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 août 2007 à 08:40
Je l'ai écrite beaucoup trops vite :

Corrections : Omission du paramètre de la fonction du thread, la variable globale pas initialisée, getch deprecated.
Améliorations : Suppression de l'include de conio.h, remplacement de la variable globale par un évènement.
#include <stdio.h>
#include <windows.h>

DWORD __stdcall TrieTableau(PVOID hEvent)
{
  do
  {
    // Trie du tableau
  }
  while (WaitForSingleObject((HANDLE)hEvent, 0) == WAIT_OBJECT_0);
  return 0;
}

void pause()
{
  HANDLE hInput;    // Handle de l'entrée standard
  DWORD nRead;      // Nombre d'octets lus
  TCHAR buffer;     // Réception du caractère
  DWORD nOldMode;   // Sauvegarde le mode précédent pour le restituer
 
  hInput = GetStdHandle(STD_INPUT_HANDLE);
  GetConsoleMode(hInput, &nOldMode);
  SetConsoleMode(hInput, 0);
  ReadConsole(hInput, &buffer, 1, &nRead, NULL);
  SetConsoleMode(hInput, nOldMode);
}

int main()
{
  DWORD id;          // id du thread
  HANDLE hThread;    // Handle du thread
  HANDLE hEvent;     // Handle de l'évènement de fin de trie

  hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  hThread = CreateThread(NULL, 0, TrieTableau, hEvent, 0, &id);
  printf("Appuyer sur une touche pour stopper le trie\n");
  pause();
  SetEvent(hEvent);
  WaitForSingleObject(hThread, INFINITE);
  printf("Fin du trie\n");
  CloseHandle(hThread);
  CloseHandle(hEvent);
  return 0;
}
Rejoignez-nous