Garder la main durant un calcul lourd

Garder la main durant un calcul lourd - C++ - Programmation

Marsh Posté le 20-05-2003 à 11:48:20    

Salut :-)
 
Je suis en train de faire un programme sous C++ Builder 4 avec une interface. Mon problème est que je lance un calcul long et lourd en cliquant sur un bouton et je voudrais pouvoir l'arrêter avant qu'il finisse en cas de besoin... Hors, je n'ai absolument pas la main... J'ai fait un thread pour le calcul en le mettant en priorité basse mais ca ne change rien. J'ai fait une fenêtre avec un bouton pour arrêter le calcul, mais je n'arrive pas à avoir la main pour cliquer dessus...
 
Quelqu'un aurait il une solution? Existe t il une option pour permettre de toujours garder la main?
 
Merci d'avance :-)

Reply

Marsh Posté le 20-05-2003 à 11:48:20   

Reply

Marsh Posté le 20-05-2003 à 12:01:58    

Je me souviens que ce sujet a deja ete aborde. Fais une petite recherche.


Message édité par polo021 le 20-05-2003 à 12:07:25
Reply

Marsh Posté le 20-05-2003 à 12:22:51    

T'aurais pas par hasard une boucle genre while not threadFini ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-05-2003 à 12:37:23    

Darsh a écrit :

J'ai fait un thread pour le calcul en le mettant en priorité basse mais ca ne change rien.


C'est bien beau de faire un thread, mais le mets tu en pause une fois ton itération terminée ?
Genre :
 

Code :
  1. while (fini == false)
  2. {
  3.    // calcul
  4.    Thread.Sleep(20); // on endort le thread pendant 20 ms histoire de laisser au système le temps de traiter les évènements
  5. }


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-05-2003 à 12:40:37    

Ouais enfin c'est peut-être plus propre c'est de ne pas faire de boucle, et d'utiliser l'événement OnTreadEnd (ou un truc du genre) du TThread
Sinon un petit Application.HandleMessage dans la boucle qui attend la fin du thread, plutôt que d'endormir le thread, non ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-05-2003 à 12:43:21    

chelou ton histoire a mon avis t'as du merder qqpart
 
Donc tu fais une thread annexe qui se charge du calcul, et normalement ta thread principale continue a s'occuper de la boucle de messages
le plus simple pour savoir si la thread a fini son boulot et que cette derniere envoie un message a la principale. (via un SendMessage tout con)
 

Reply

Marsh Posté le 20-05-2003 à 12:46:09    

Ouais enfin vu qu'il est en C++Builder je suppose qu'il utilise la classe TThread qui encapsule le tout, donc c'est pas un message qu'il doit intercepter :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-05-2003 à 12:47:47    

antp a écrit :

Ouais enfin vu qu'il est en C++Builder je suppose qu'il utilise la classe TThread qui encapsule le tout, donc c'est pas un message qu'il doit intercepter :D
 


 
ouais j'ai remarquer que je risquais d'etre a cote de la plaque apres avoir lu ta precedente reponse [:totozzz] (J'avais zappe le fait qu'il etait en builder)
 
tiens, un truc qui me turlupine, chaque fois que qqun ici poste du code de builder les fonctions sont en __fastcall. c koi cette propagande ?

Reply

Marsh Posté le 20-05-2003 à 12:54:21    

C'est C++Builder qui met ça devant toutes les fonctions qu'il crée tout seul

Citation :


Use the __fastcall modifier to declare functions that expect parameters to be passed in registers. The first three parameters are passed (from left to right) in EAX, EDX, and ECX, if they fit in the register. The registers are not used if the parameter is a floating-point or struct type.
 
All form class member functions must use the __fastcall convention.


En fait faut pas oublier que C++Builder doit assurer la compatiblité avec Delphi : une bonne partie du code utilisé (composants visuels) et du code Delphi, or en Delphi par défaut il passe justement les params des fonctions/méthodes dans les registres si possible, j'imagine que c'est pour ça qu'ils ont mis ce __fastcall :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-05-2003 à 13:04:25    

ok, me demandais pkoi, du genre ils esperent gagner deux pouillemes de microseconde sur leur appli avec ca :D
Mais visiblement, c'est logique  
 
thks
 
(N'empeche me demande comment il gere le renvoi de structure de plus de 8 bits, me semblait que EAX etait reservé pour ce genre de sport)
 
 

Reply

Marsh Posté le 20-05-2003 à 13:04:25   

Reply

Marsh Posté le 20-05-2003 à 13:40:51    

antp a écrit :

Ouais enfin c'est peut-être plus propre c'est de ne pas faire de boucle, et d'utiliser l'événement OnTreadEnd (ou un truc du genre) du TThread
Sinon un petit Application.HandleMessage dans la boucle qui attend la fin du thread, plutôt que d'endormir le thread, non ?

encore un truc de modo ca  :o

Reply

Marsh Posté le 23-05-2003 à 11:04:01    

Moi, j'avais eu le même pb (avec le même tentative de résoudre mon pb avec un thread qui s'était soldée par un échec) en Delphi.
 
On m'avait dit d'utiliser une méthode de l'objet Application (ProcessMessage() ou un truc du genre) et ça marchait très bien :) Je sais pas si y'a l'équivalent sous C++ builder.

Reply

Marsh Posté le 23-05-2003 à 11:07:32    

rufo a écrit :


 
On m'avait dit d'utiliser une méthode de l'objet Application (ProcessMessage() ou un truc du genre) et ça marchait très bien :) Je sais pas si y'a l'équivalent sous C++ builder.


 
comme je l'ai dit, Application->HandleMessage(), ou Application->ProcessMessages()
Le premier prend moins de CPU mais convient plutôt aux boucles d'attente où on ne fait rien d'autre, le second est plutôt à placer des des boucles entre des opérations "lourdes"


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 23-05-2003 à 11:13:15    

antp a écrit :


 
comme je l'ai dit, Application->HandleMessage(), ou Application->ProcessMessages()
Le premier prend moins de CPU mais convient plutôt aux boucles d'attente où on ne fait rien d'autre, le second est plutôt à placer des des boucles entre des opérations "lourdes"


 
autant pour moi, j'avais raté un de tes messages...

Reply

Marsh Posté le 23-05-2003 à 17:17:05    

Merci bcp pour toutes ces réponses :)

Reply

Sujets relatifs:

Leave a Replay

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