Votre question

[Qt] QThread : Boucle et exec()

Tags :
  • Thread
  • Programmation
Dernière réponse : dans Programmation
Anonyme
15 Avril 2010 13:06:36

Bonjour,

Je me penche depuis peu sur Qt, donc pardonnez moi si ma questioin semble un peu triviale.
Je souhaite utiliser read() de manière bloquante et en boucle sur un port série dans un thread (ne pas geler l'application pendant l'attente de données). Les données reçus sont stockées dans un autre objet qui assure la transaction entre ce thread et un autre. C'est pourquoi il me serait utile d'utiliser des signaux pour notifier la présence de nouvelles données par exemple.
Mon problème est donc le suivant, si je réalise une quelconque boucle infini dans la méthode run() de mon QThread, je ne rentre jamais dans la boucle d'évènement. Hors j'ai besoin d'utiliser des signaux. Comment permettre à la fois l'utilisation d'une boucle dans un QThread et l'utilisation des signaux ?

  1. void run(){
  2. do{
  3. char buff[256];
  4. if(read(fd,buff,256) < 0){
  5. //Erreur et émissions de signaux
  6. }
  7. else{
  8. //Transaction (+mutex) et émissions de signaux
  9. }
  10. }while(1 /*Condition quelconque*/);
  11. //exec(); //La gestion des signaux ne commence qu'ici, non ?
  12. }


Je dois faire une bourde quelque part...
Merci

Autres pages sur : qthread boucle exec

a b L Programmation
15 Avril 2010 21:00:54

Oui, c'est la façon courante de traiter toute communication, et plus généralement tout traitement visible dans une application. Sinon, il faut faire afficher un sablier même si l'action est très rapide (c'est une base ergonomique).

Pour la communication entre le thread et le thread principal, tu peux faire des postEvent() qui se contente d'ajouter un évènement dans la pile des évènements. postEvent() retourne tout de suite, c'est le thread principal qui traitera l'évènement.
Il ne faut pas faire sendEvent() car avec cette méthode, l'évènement est traité desuite, mais c'est exécuté dans thread qui l'appelle (ce qui est un problème puisque ça bloque le thread).
Tu peux facilement le voir en faisant du debug dans le thread.

Tu peux par exemple donner une référence de ton objet, avec qui communiquer, en constructeur du thread, et gérer tes propres signaux.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS