Problème dans une boucle

Résolu
Toto0067 Messages postés 6 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 15 mars 2007 - 14 mars 2007 à 17:10
Toto0067 Messages postés 6 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 15 mars 2007 - 15 mars 2007 à 15:26
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

9 réponses

Toto0067 Messages postés 6 Date d'inscription mardi 21 juin 2005 Statut Membre Dernière intervention 15 mars 2007
15 mars 2007 à 15:26
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
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
14 mars 2007 à 17:29
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 mars 2007 à 17:52
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;
}
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 mars 2007 à 17:59
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.
0

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

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 mars 2007 à 18:03
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.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
14 mars 2007 à 18:59
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 mars 2007 à 20:36
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 mars 2007 à 21:15
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);
}
}
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
14 mars 2007 à 21:56
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.
0
Rejoignez-nous