Arrêter une boucle infini

Résolu
Signaler
Messages postés
27
Date d'inscription
mardi 17 avril 2007
Statut
Membre
Dernière intervention
18 octobre 2007
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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

Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

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>
Messages postés
27
Date d'inscription
mardi 17 avril 2007
Statut
Membre
Dernière intervention
18 octobre 2007

merci bcp!!!
je vais essayer de m'en sortir  avec ça!! maintenant GO pour le systeme de brassage du tableau!
Messages postés
27
Date d'inscription
mardi 17 avril 2007
Statut
Membre
Dernière intervention
18 octobre 2007

tu aurais un code comme exemple?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
while( non appui sur une touche && temps_écoulé < nombre_de_secondes_souhaité )




_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

roohhh oui désolé moment de fatigue
<endl>Un clavier Azerty en vaut deux

</endl>
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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;
}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Zut j'ai zappé le getch(); avant le stop = TRUE;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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;
}