Posts avant Rollback

Citation Envoyé par c_boireau
Bonjour,

j'ai intégré dans mon application un programme qui doit tourner en permanence après appui sur un bouton.
Cependant, lorsque je veux l'interrompre avec appui sur le bouton "Arrêt", cela est impossible (obligé de faire clic droit et terminer maintenant).

Voila et tout ceci est un peu "forcing" à mon goût !!!

Merci pour vos réponses, et à bientôt !
Citation Envoyé par jehrikhan
Si j'ai bien compris, tu as un bouton disons "Lancer" qui démarre une boucle infini. Et un bouton "Arrêt" qui devrait te faire quitter cette boucle.

Si c'est le cas, je te conseillerais plutôt d'écrire le code de ta boucle dans un thread, que tu démarres au clic sur "Lancer" et que tu arretes au clic sur "Arret".


Si c'est pas le cas explique un peu plus précisément ce que tu cherches à faire :p
Citation Envoyé par c_boireau
Merci jehrikhan, tu confirme ce que je pensai !!!

Mais, je n'ai jamais utilisé les threads

Peux tu m'aiguiller sur la façon de s'y prendre, ou me passer un lien qui m'aiderai stp ?
Citation Envoyé par jehrikhan
regarde du coté de la classe TThread de la VCL.

Ca n'a rien de compliquer en fait.
Pour créer un Thread il suffi de créer une classe héritant de TThread.
Ou encore de passer par fichier->nouveau->autre->objet Thread

Il te reste qu'a surcharger la fonction Execute pour y insérer ton code.
Ensuite, dans ton programme, tu crée une instance de ta classe Thread.
Là tu as deux choix soit lui passer true en paramètre pour qu'il se lance immédiatement, soit false et le démarrer plus tard par la méthode Resume().


Pour l'arrêter il suffit d'appeler la fonction Terminate().

Mais tout cela est très bien expliqué dans l'aide de Borland :p
Sinon un petit recherche sur le forum devrait t'amener sur pas mal de discutions sur le sujet
Citation Envoyé par c_boireau
OK, et est ce que cela peut fonctionner sans utiliser d'unité Thread : c'est à dire si carrément dans mon code je met "TThread *LeThread = new MyThread (false);" , puis "LeThread->Resume();" , ...

Citation Envoyé par jehrikhan
Il faudra dans tous les cas surcharger la méthode Execute(), qui doit contenir le code de ton thread. C'est à dire ta boucle dans ton cas.

Bien entendu si t ne veux pas ajouter d'unité, tu peux mettre la définition de la classe de Thread héritant de TThread dans le fichier d'en tête de ton programme.
Citation Envoyé par c_boireau
C'est que le soucis c'est que dans ma boucle infinie, j'utilise des objets situés dans l'IHM donc comment pourrais je faire !!!!

En plus, lorsque je démarre le programme ça démarre tout seul maintenant sans appui sur le bouton !!!
Citation Envoyé par pottiez
Si ca démarre tout seul c'est que le booléen de ton constructeur n'est pas à la bonne valeur, il devrait être à true, ensuite pour accéder au composant vcl tu doit utiliser la fonction Synchronize
Citation Envoyé par jehrikhan
Pour le parametre du constructeur j'ai inversé en fait, autant pour moi :p
Il faut lui donner false pour qu'il démarre automatiquement et true pour qu'il démarre à l'appel de la fonction Resume.
Citation Envoyé par c_boireau
C'est bon, j'ai mis le paramètre à "true".


Par contre, lorsque j'appuie sur le bouton "arrêt" le Thread ne s'arrête pas !!!
J'ai codé comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
LeThread->Terminate();
ShowMessage ("Fin Comm");
Pour la fonction "Synchronize", il faut l'utiliser où ça : dans la fonction "Execute" ? dans l'application principale ?
Désolé, mais je n'ai jamais utilisé les fonctions des Threads !!!


Citation Envoyé par pottiez
Dans ta boucle infinie il faut que tu test si la propriété Terminated est à true, si elle est à true, tu arrête ta boucle sinon tu continue.
Citation Envoyé par c_boireau
C'est ok merci beaucoup

Mais pour la fonction Synchronize(), où dois je la mettre et comment pour pouvoir utiliser mes composants (Tchart, ...) svp ????

Citation Envoyé par pottiez
En fait la fonction synchronise, permet à ce que l'application et le Thread n'accède pas en même temps aux composants, pour l'utiliser, il faut mettre tes accès aux composant dans une fonction que tu définit dans ta classe Thread, et à chaque foi que tu veut faire cet accès sur le composant, tu appelle la fonction en la passant en parametre de la méthode Synchronize
Citation Envoyé par c_boireau
En fait la fonction synchronise, permet à ce que l'application et le Thread n'accède pas en même temps aux composants, pour l'utiliser, il faut mettre tes accès aux composant dans une fonction que tu définit dans ta classe Thread, et à chaque foi que tu veut faire cet accès sur le composant, tu appelle la fonction en la passant en parametre de la méthode Synchronize
Moèp, ça à l'air assez compliqué je trouve !!!
Qu'appelles tu "accès aux composants", et ils faut les mettre dans une fonction créée par moi dans la classe Thread ?



Citation Envoyé par pottiez
Oui il faut créer une, ou plusieurs fonctions, toi même dans la classe Thread.

Ce que j'appelle accès au composants, est toute les actions que tu fait sur un composant VCL

Bon courage
Citation Envoyé par c_boireau
Il n'y aurait pas de la doc, ou des exemples là dessus svp ?

Citation Envoyé par pottiez
Voici l'exemple donnée par l'aide de BCB pour la méthode Synchronize :
Citation Envoyé par Aide de BCB6
Cet exemple montre comment appeler la méthode click de sorte que le thread soit sécurisé :

void __fastcall TMyThread:ushTheButton(void)

{
Button1->Click();
}

void __fastcall TMyThread::Execute()
{
...
Synchronize(PushTheButton);
...
}
Citation Envoyé par c_boireau
Merci pottiez pour ton aide !!!

Les composants que je veux utiliser sont des graphiques (TChart avec FastLine), et dans mon application c'est pour afficher les valeurs dedans à chaque fois qu'il y en a une qui arrive, alors de quel type serait la fonction ???

En plus, quand tu mets "Button1->Click();" , ce bouton n'est pas déclaré dans le Thread, est ce que cela marche vraiment ?

Citation Envoyé par pottiez
Effectivement le Button1->Click() ne fonctionnerai pas vraiment, il faudrait ajouté le nom de la Form sur laquelle le bouton est mis et inclure le fichier .h de la Form en question

Pour ton TChart, je ne connait pas ton code, mais un fonction basique comme dans l'exemple devrait suffire, si tu as des valeur à donner, tu doit pouvoir ajouter des paramètres à ta fonction, comme n'importe quel fonction
Citation Envoyé par c_boireau
Merci encore Pottiez et à toute la communauté du forum !!!

ça fonctionne nickel !!!