Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1873 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Garder la main durant un calcul lourd

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Garder la main durant un calcul lourd

n°401003
Darsh
Posté le 20-05-2003 à 11:48:20  profilanswer
 

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 :-)

mood
Publicité
Posté le 20-05-2003 à 11:48:20  profilanswer
 

n°401034
polo021
Posté le 20-05-2003 à 12:01:58  profilanswer
 

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
n°401061
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2003 à 12:22:51  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°401070
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2003 à 12:37:23  profilanswer
 

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)
n°401072
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2003 à 12:40:37  profilanswer
 

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
n°401076
chrisbk
-
Posté le 20-05-2003 à 12:43:21  profilanswer
 

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)
 

n°401078
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2003 à 12:46:09  profilanswer
 

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
n°401080
chrisbk
-
Posté le 20-05-2003 à 12:47:47  profilanswer
 

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 ?

n°401088
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2003 à 12:54:21  profilanswer
 

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
n°401107
chrisbk
-
Posté le 20-05-2003 à 13:04:25  profilanswer
 

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)
 
 

mood
Publicité
Posté le 20-05-2003 à 13:04:25  profilanswer
 

n°401191
harrysauce
Miaaaooou!
Posté le 20-05-2003 à 13:40:51  profilanswer
 

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

n°405629
rufo
Pas me confondre avec Lycos!
Posté le 23-05-2003 à 11:04:01  profilanswer
 

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.

n°405644
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-05-2003 à 11:07:32  profilanswer
 

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
n°405663
rufo
Pas me confondre avec Lycos!
Posté le 23-05-2003 à 11:13:15  profilanswer
 

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...

n°406370
Darsh
Posté le 23-05-2003 à 17:17:05  profilanswer
 

Merci bcp pour toutes ces réponses :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Garder la main durant un calcul lourd

 

Sujets relatifs
compiler lier un .h avec un .cpp et un autre cpp conteant main()menu fait à la main
[Math] calcul du cercle circonscrit a un triangle en 3Dtit coup de main sur ANT svp
calcul matricielCalcul TVA avec PHP [NEED HELP]
Un petit coup de main en JavaScript SVP ?C'est loin les maths... Calcul de distance en 2D
récupérer le dernier calcul en phpCoup de main Java
Plus de sujets relatifs à : Garder la main durant un calcul lourd


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR