begin process at 2012 05 29 14:35:29
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Problème dans une boucle


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème dans une boucle

mercredi 14 mars 2007 à 17:10:17 | Problème dans une boucle

Toto0067

Bonjour.

Alors voila, mon problème est le suivant:

J'ai une boucle while dans laquelle je fais un certain nombre de choses et donc forcément cela prend du temps... Cependant, le problème est que lorsque le programme rentre dans cette boucle, je ne peux plus cliquer sur aucun bouton de la form. Et justement, ce que je veux faire, c'est de pouvoir interrompre cette boucle en cliquant sur un bouton de la form.

J'ai vu qu'en langage basic existe l'instruction "DoEvents". Y a-t-il un équivalent en C++ ?
Ou y a-t-il une solution à mon problème ?

merci
mercredi 14 mars 2007 à 17:29:00 | Re : Problème dans une boucle

luhtor

Je vois qu'une solution: tu créés un thread qui effectue tout on gros calcul, et tu l'interrompt éventuellement si tu cliques sur le bouton.
mercredi 14 mars 2007 à 17:52:45 | Re : Problème dans une boucle

SnOOpss

Personnellement je trouve ca tres mauvais comme programmation car tu créé un programme qu'on ne peut arretter  que grace a ctrl+alt+suppr (tu bloque TOUT les message passé a cette application).
Et tu obligé de faire une boucle (pour la performance) tu peut faire tout simplement par exemple

bool boucle;

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{

        if (boucle) maboucle()

switch(message)
{
...
...
         }
}

void maboucle (void) {
i+=1;
...
...
if (i>1000) boucle = false;
}
mercredi 14 mars 2007 à 17:59:16 | Re : Problème dans une boucle

SnOOpss

Désolé pour les fautes j'avoue (j'ai pas relu) sinon encore mieux (la boucle ne se fera QUE si il n'y aucun message a traiter

MSG Msg;

//boucle principale
// On initialise une première fois notre message
PeekMessage(&Msg, hwnd, 0, 0, PM_NOREMOVE);

   // On boucle tant qu'on n'a pas reçu le message WM_QUIT
while (Msg.message != WM_QUIT)
{
// Y a t-il un message à traiter ?
if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
{
// Oui : on le traduit et on le dispatche
TranslateMessage(&Msg);
DispatchMessage(&Msg);

}
else {
                   maboucle()
                }
        }
}

Et evidement la procedure maboucle() n'est pas une boucle mais juste un pas de plus.
mercredi 14 mars 2007 à 18:03:37 | Re : Problème dans une boucle

SnOOpss

En passant ca evite a une application de prendre 100/100 de l'UC (ce qui va se passer dans ton cas avec ta boucle). Et je viens de voir que mon premier exemple ne marchera pas car tant qu'il n'y aucun message a passer cette partie n'est pas traité.
Sinon y a le timer aussi pour eviter la boucle.
mercredi 14 mars 2007 à 18:59:04 | Re : Problème dans une boucle

luhtor

Mais euh SnOOpss, tu as lu son post ? Il s'en fou du timer, ce qu'il veut c'est une fonction qu'il peut interrompre. Ta première proposition, c'est crados comme truc et meme irréalisable. Ca marchera si t'as un pti programme a deux balles a faire.


mercredi 14 mars 2007 à 20:36:32 | Re : Problème dans une boucle

SnOOpss

Un petit  programme a 2 balles ?
La technique ne viens pas de moi, et elle est souvent utilisé dans les applications gourmandes en UC justement comme les jeux pour eviter de tout bloquer (la deuxieme methode, la premiere me suis chié) et perso meme un debutant peut l'appliquer avec les bases, tandis que les threads c'est pas dit qu'il connaisse.

Je ne connait pas sa boucle mais c'est egalement possible avec un timer, c'est la maniere la plus crade que je connais mais ca marche.
tu lances un timer et tu traites
WM_TIMER: { maboucle(); }

Le meilleur moyen d'avoir une fonction qu'on peut pas interrompre c'est de ne pas faire une fonction bloquante. J'ai toujours vu que c'etait a eviter comme la peste.
mercredi 14 mars 2007 à 21:15:55 | Re : Problème dans une boucle

SnOOpss

Evidement la fonction maboucle() n'est PAS une boucle mais a chaque appel elle avance d'un pas.

Sinon teste ca, mais je te conseille plutot d'eviter une boucle bloquante trop longue.

void DoEventsCpp(void)
{
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
mercredi 14 mars 2007 à 21:56:10 | Re : Problème dans une boucle

luhtor

Mais cette astuce, ca marche pour un programme complètement figé, c'est totalement anti évolutif a mon gout. On peut pas savoir les besoins futurs du programme. On va pas créer une fonction pour chaque nouvelle tache lourde que l'on doit effectuer.
jeudi 15 mars 2007 à 15:26:47 | Re : Problème dans une boucle

Toto0067

Réponse acceptée !
En fait, j'ai utilisé un thread et le programme fonctionne correctement. De plus, le programme est assez court. (Petite précision: j'ai de bonnes connaissances en programmation )


Je pensais qu'il existait une fonction comme "DoEvents" en VB.NET en C++. Mais bon, maintenant le problème est réglé.

Merci pour toutes vos réponses


Cette discussion est classée dans : bouton, problème, boucle, form


Répondre à ce message

Sujets en rapport avec ce message

bouton stop [ par rlope ] BonjourJ'ai un petit problème avec un bouton STOP que je voudrais créer. (Visual C++ boite de dialogue)Explication :Avec un bouton de ma boite de dial changer le text d'un label [ par pierre_33 ] Bonjour,J'ai un problème je n'arrive pas a changer le test d'un label lors du click sur un bouton .Mon label et bouton son bien créer, je créer le sig Problème de fenetres [ par Toobad ] Salut tout le monde,J'suis un ptit nouveau dans la programmation Win32 et comme on peut s'en douter pour un nouveau, j'ai un tas de problèmes. J'ai fa sortir d'une boucle while infinie avec un bouton [ par bertrandbasch ] Bonjour,En fait je voudrai pouvoir lancer une boucle while à l'aide d'un bouton 1 qui pourrait être stoppé à l'aide d'un bouton stop.Il me faut cette problème avec timer [ par gogeta2003 ] Salut à tous j'ai un prb un un timer qui se trouve dans une boucle do while. AnsiString  a=3.5; do{ //programme //........ Timer1->Interval++; }whil Problème avec une boucle while [ par arconius ] voilà j'ai fait un prog où l'on tire des dés mais j'ai un problème avec ma boucle while car au lieu de me donner un chiffre aléatoire à chaque fois il C++ builder : Interrompre une boucle lors de l'appui sur un bouton [ par Minou1981 ] Bonjour à tous,Je suis en train de programmer avec c++ builder. Mon probleme est le suivant: je ne sais pas comment faire pour interrompre une boucle Problème de boucle dans un muli-thread [ par vinvay ] Alors voila, j'ai 4 threads qui tournent en même temps, ceux-ci utilisant la même fonction.Dans cette fonction, il y a une première boucle for suivie Windows Form Gui [ par abdoulax ] Bon j'ai un petit problème !!!!Je suis en plein project C, il me reste très peu de tps pour le finir. Le problème c'est que j'aurai besoin de faire un Problème de form avec showdialog [ par emmanuel9 ] Bonjour à tous, J'ai deux forms, form1 et form2 et dans form1 quand on clique sur un bouton je fais :  : Form2 * f2 = new Form2() ; f2->ShowDialog()


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales