Accueil > Forum > > > > Problème dans une boucle
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()
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|