l'appel de QThread.méthode exec() est nécessaire dans QThread?
Je n'appelle pas exec()
dans mon code, mais la timer
et QUdpSocket
fonctionne bien. Est exec()
l'habitude d'attendre pour un event
continuer?
Mise à JOUR: le timer
a été de travailler, parce que je ne l'avait pas appelé moveToThread(this)
sur le QThread
, ce qui signifiait que le QThread
était en fait encore partie de la main thread
. Comme pour QUdpSocket
eh bien, j'aide les bureaux de functions
. Donc il n'a pas besoin de travailler avec signals
.
ASTUCE: si vous avez besoin de faire init
choses, qui nécessite une event loop
dans votre QThread
, vous pouvez delay
appel moveToThread
jusqu'à ce que vous n'avez pas besoin de la signals
plus, c'est pratique quand le programme est en cours de chargement. Vous n'avez pas besoin de l'appeler dans le constructeur (on pourrait appeler cela de l'intérieur run()
par exemple), il suffit de copier le this QThread
pointeur vers une variable et faire la call
plus/ailleurs à l'aide du pointeur.
OriginalL'auteur yan bellavance | 2010-02-26
Vous devez vous connecter pour publier un commentaire.
Pour utiliser votre fil, au lieu de la QApplication l'exécution de la boucle, vous devez appeler
moveToThread(this)
dans le thread constructeur ET le lieu d'exécution de la boucle protégées au sein de larun()
méthode de votre QThread classe dérivée.Séparer les threads d'exécution de la boucle empêche la QApplication boucle de surcharger avec des non-interface de signaux et de slots, et donc retarder .e.g cliquez sur le bouton de la fente de l'exécution, de faire votre demande "lag".
Remarque: Normalement, vous toujours sous-classe QThread, voir Doc de Qt pour plus d'informations
Edit: Qt doc est mal, de lire ce fil http://blog.qt.digia.com/2010/06/17/youre-doing-it-wrong/
boucle d'événement est quelque chose qui ne exec() et les blocs de code après cette classe.exec (). Dans ce cas, il est destiné à être QThread.exec(). Remarque: Si votre fréquence du signal est faible, vous pouvez simplement abandonner l'idée de threads, comme la plus part de temps Qt commandes sont asynchrones.
donc disons que j'ai une minuterie. Maintenant, si je veux que mon minuteur de travail, j'ai besoin d'appeler exec. mais que faire si j'ai besoin de faire le traitement en boucle dans ma méthode, j'aurais besoin d'appeler exec une fois chaque boucle? Si la minuterie n'est même pas près d'être fait et je veux faire le plus de traitement possible pendant que la minuterie expire. J'ai lu quelque part à l'aide d'un timer à 0 timeout est utile pour gérer la eventloop.
"le traitement en boucle" je ne reçois pas votre point de vue. Et ne doit JAMAIS appeler exec() plusieurs fois dans n'importe quel thread, c'est uggly style de codage. Si vous avez vraiment besoin de toute votre puissance de traitement, mais encore de traiter des signaux/slots: forever{ processEvents(); //atm, je ne peux pas rappeler comment que qt fonction est appelée extrem_cpu_intense_task(args); msleep(ms); //donner quelques ms respiration de temps }; Note: ce n'est que pour séparer les QThread classes dérivées, JAMAIS le faire pour l'UI, et seulement si vous avez vraiment besoin de massif puissance de traitement ET une haute fréquence de signal/slot d'émission et d'exécution.
il y a 2 fonctions dans le QUdpSocket (en fait QAbstractSocket) appelé waitForReadyRead() et waitForBytesWriten(). cela montre qu'il est possible d'avoir de la transformation effectuée sans l'utilisation de signal. Bien sûr, vous ne pouvez pas utiliser ces si votre QThread n'est pas séparée de thread gui, il génère un double exception. Dans le mandlebrot exemple le run() contient un forever{} boucle.
OriginalL'auteur drahnr
Votre minuterie et la douille sont probablement à l'aide de la boucle principale qui est démarré lorsque vous appelez
QCoreApplication::exec()
.Même si je suis sûre qu'il y a de bonnes raisons pour exécuter une boucle dans un thread, je ne peux pas venir avec un.La QThread documentation états:
Sans une boucle d'événement, il est possible d'émettre les signaux qui sont traitées par le thread GUI, ou sur un autre fil contenant une boucle d'événements. Cela implique qu'un thread doit avoir une boucle d'événements dans l'ordre pour ses fentes pour être efficace. Par la documentation ci-dessus, certaines classes, comme QTimer, besoin d'un événement en cours d'exécution de la boucle pour lesquelles vous devez appeler
QThread::exec()
. D'autres classes, comme QTCPSocket ont des capacités pour exécuter avec ou sans boucle d'événements, selon les fonctions utilisées. La documentation pour les classes devraient indiquer, le cas échéant, les exigences qu'ils ont.La raison principale est que si vous avez plusieurs threads ou plusieurs objets dans un non-thread GUI. De cette façon, les fentes et les signaux de ces objets peut être déclenché et exécuté sans ralentir le GUI boucle d'événements.
Message édité et ajouté des précisions.
Pouvez-vous ajouter un peu de code en expliquant exactement où est
exec()
appelé? Est-il dans QThread est dérivé du constructeur? Si j'appelle le fil de la création de QThread, il va bloquer le fil.OriginalL'auteur Kaleb Pederson
Il dépend de vos programmes. Voici un exemple:
Sans exec(), OnTransfer ne sera jamais appelé. MAIS si votre créer curl en dehors de courir avec ce (à supposer MyThread parent est thread principal) en tant que parent :
Celui-ci fonctionnera comme prévu. OnTransfer sera appelée.
OriginalL'auteur Rozi