Avoir la main pendant une exécution

Avoir la main pendant une exécution - C++ - Programmation

Marsh Posté le 11-05-2006 à 11:26:41    

Bonjour,
 
je travail sur une application SDI développée sous Visual C++.
Dans mon application j'ai deux boutons:
-Executer : qui me permet de lancer mon application (envoie et reception de données par le port COM)
-Arrêter : pour arrêter le transfert de ses données quand j'appuie dessus.
 
mon problème est que une fois que mon transfert de données est en cours, si j'appuie sur le bouton arrêter ça na marche pas. Mon bouton n'a aucun effet.
 
En fait, lorsque j'appuie sur le bouton Arrêter, mon programme est sensé mettre une variable à TRUE. Et dans ma boucle d'exécution, je teste si la variable est à TRUE. Si c'est le cas, normalement, j'arrête mon programme. Hors en réalité, mon programme s"execute j'usqu'à la fin.
 
Je comprend pas pourquoi.
Avez vous des idées?

Reply

Marsh Posté le 11-05-2006 à 11:26:41   

Reply

Marsh Posté le 11-05-2006 à 11:30:40    

utiliser des threads

Reply

Marsh Posté le 11-05-2006 à 11:34:02    

c'est ce que je suis en train de voir, mais je n'en ai jamais utilisé et j'ai un peu de mal a comprendre comment ça fonctionne exactement

Reply

Marsh Posté le 11-05-2006 à 11:39:05    

Tout est dans la msdn, y'a des exemples, etc.
Reviens si tu as des soucis concrets.

Reply

Marsh Posté le 11-05-2006 à 11:44:18    

Ok merci, en fait je suis déjà dans la MSDN, et si j'ai un soucis...

Reply

Marsh Posté le 11-05-2006 à 12:26:46    

En fait, je comprend pas trop comment je dois m'y prendre avec mes deux boutons.  
 
C'est vrai qu'il n'y a pas beaucoup d'explication pour travailler avec des threads sur le net en C++, par contre en Java...ça y'en a!
 
Bref, est-ce que je dois faire un thread pour chaque bouton? Ou un seul thread qui appel la fonction du bon bouton au bon moment?

Reply

Marsh Posté le 11-05-2006 à 13:23:08    

Tu fais un thread qui communique sur ton port et l'autre gere tes boutons... Non ?

Reply

Marsh Posté le 11-05-2006 à 13:45:13    

ou un seul bouton qui démarre et arrete le thread ?

Reply

Marsh Posté le 11-05-2006 à 14:50:57    

un seul bouton pour deux action c'est risqué car :
"il ne faut pas prendre les utilisateurs pour des boulets incultes mais il ne faut pas oublier qu'ils le sont"
:o

Reply

Marsh Posté le 11-05-2006 à 14:57:29    

il me faut forcement deux boutons
Par contre, si vous savez m'expliquer comment je dois procéder pour intégrer ma fonction qui exécute dans un thread et où je dois mettre ça dans mon programme ça m'aidera peut-être à y voir plus clair car je ne trouve pas ce genre de chose dans la MSDN (seulement les fonctions).  
Je n'arrive pas à trouver d'explication sur un fonctionnement global des thread, ou comment on les utilises exactement,... Mais si quelqu'un a un bon cours de débutant je suis prenneuse, je pense que ça m'aiderait beaucoup et que ça m'éviterait de poser des questions stupides. :pt1cable:  
 

Reply

Marsh Posté le 11-05-2006 à 14:57:29   

Reply

Marsh Posté le 11-05-2006 à 15:00:30    

jan san kar a écrit :

un seul bouton pour deux action c'est risqué car :
"il ne faut pas prendre les utilisateurs pour des boulets incultes mais il ne faut pas oublier qu'ils le sont"
:o


 
pas mal :o

Reply

Marsh Posté le 11-05-2006 à 15:01:17    

ben
-création de thread,
- lancement de l'execution du thread, en tache de fond
- evenement quand le thread se termine.

Reply

Marsh Posté le 11-05-2006 à 15:04:46    

bubulle63 a écrit :

Bonjour,
 
je travail sur une application SDI développée sous Visual C++.
....
 
Je comprend pas pourquoi.
Avez vous des idées?


 
 
tu peux aussi utiliser le mecanisme de "traitement de la boucle d'inactivité".
Expliqué ici dans la msdn en français : http://msdn.microsoft.com/library/ [...] essing.asp
 
grossierement, voila ce que tu fais dans ta boucle de traitement d'envoi et de reception de message par exemple :  
 

Code :
  1. MSG m_msg;
  2. // BOUCLE DE TRAITEMENT
  3. while( bool ) {
  4.   // Gestion des messages windows (stop, affichage)
  5.   while(PeekMessage(&m_msg,NULL,0,0,PM_REMOVE)) {
  6.     TranslateMessage(&m_msg);
  7.     DispatchMessage(&m_msg);
  8.   }
  9.  
  10.   // Fais tes traitements
  11.   .....
  12. } // END OF WHILE


 
si une iteration de traitement est rapide, tu peux ne faire cette gestion de message qu'une fois toute les n boucles par exemple.
 
Edit : Une petite explication tout de meme :  
Quand tu clique sur ton bouton arreter, windows envoie un message a ton application pour lui signifier cet evenement (click), mais comme ton application est occupé dans un traitement, elle ne reçoit pas ce message.
La boucle donnée dans l'exemple force la consommation des messages eventuellement en attente par ton application.


Message édité par elsed le 11-05-2006 à 15:13:34
Reply

Marsh Posté le 11-05-2006 à 16:35:22    

En fait c'est pas mal ton idee
mais ça me fait une tout p'tit problème, c'est que quand j'apuie sur mon bouton Arrêter, le programme s'arrête toujours au même endroit même si j'appui pas au même moment. ???

Reply

Marsh Posté le 12-05-2006 à 10:34:16    

bubulle63 a écrit :

En fait c'est pas mal ton idee
mais ça me fait une tout p'tit problème, c'est que quand j'apuie sur mon bouton Arrêter, le programme s'arrête toujours au même endroit même si j'appui pas au même moment. ???


 
Ben tu fais comme tu avais pensé au début, tu mets a jour une variable booleene a TRUE que tu vérifies a chaque fois dans ta boucle de traitements.  
 

Code :
  1. while( ! traitement_fini && ! click_sur_stop){
  2.   // Gestion des messages windows (stop, affichage)   
  3.   while(PeekMessage(&m_msg,NULL,0,0,PM_REMOVE))    {   
  4.     TranslateMessage(&m_msg);   
  5.     DispatchMessage(&m_msg); 
  6.   }   
  7.   // Fais tes traitements  .....
  8. }

Reply

Marsh Posté le 12-05-2006 à 10:49:00    

Du coup, c'est plus portable, ne pas l'oublier :o

Reply

Marsh Posté le 12-05-2006 à 10:52:35    

Oui c'est comme ça que je fais. :)  
 
Je pensait que le problème venait du fait qu'il faut attendre qu'une instruction de mon traitement se termine avant de tester mon bouton stop mais apparement ça s'arrête un peu quand ça veut.
 
J'ai aussi l'impression que plus j'ai d'instructions dans mon traitement plus mon bouton stop est précis dans l'endroit où il s'arrête.
 
C'est un peu bizzar, je pensait que vu comment mon programme est fait, dès que j'appui sur mon bouton, le traitement serait interrompu avant la prochaine instruction... :heink:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed