8
votes

QT signaux et emplacements, threads, app.exec () et requêtes connexes

[lié à Cette question ]

J'ai écrit ce morceau de code pour comprendre comment fonctionne des signaux QT et des machines à sous fonctionnent. J'ai besoin de quelqu'un pour expliquer le comportement et me dire si j'ai raison à propos de mes propres conclusions. P>

Mon programme: p>

ConnectionHandler.h code>

#include <QCoreApplication>
#include "connectionhandler.h"

int main(int argc, char* argv[]) {
    QCoreApplication app(argc,argv);
    ConnectionHandler handler;
    return app.exec();
}


0 commentaires

3 Réponses :


0
votes

app.exec () entre la boucle d'événement principale et attend jusqu'à ce que quitte () est appelé.

mise à jour:
La boucle d'événement principale et le code de colle généré par QMake s'occupent de transférer le message d'événement à partir du qtcpserver à votre ConnectionHandler . .

Si vous utilisiez des connexions en file d'attente, la connexion réelle au logement qtcpservers serait retardé jusqu'à ce que la boucle d'événement principale fournit la demande de connexion . .


0 commentaires

0
votes

Lorsque vous dites qu'il entre dans une boucle infinie, vous voulez dire qu'il bloque le programme?

Parce que l'écoute () fera partie de la boucle d'événement de l'application principale de la manière dont vous l'avez configurée, qui fonctionne jusqu'à ce que vous quittiez le programme. Je ne suis pas sûr de ce que le problème est. Il ne devrait pas y avoir de problèmes de votre signal émis dans la boucle d'événement d'application principale (EXEC ()) chaque fois que l'on est rencontré.

Si vous le souhaitez, vous pouvez avoir votre classe ConnectionHandlerler étendre qthread et exécuter écouter () dans son propre fil, mis à part la boucle principale de l'application.


0 commentaires

12
votes

Si vous n'appelez pas App.Exec (), le programme frappe la fin de votre principale () et se termine. (Pourquoi? Il n'y a plus de code à exécuter!)

app.exec () est une boucle infinie du style suivant: xxx

si vous utilisez une connexion en file d'attente, Ensuite, l'événement est ajouté à votre file d'attente d'événement et il sera effectué à un moment donné à l'avenir pendant la boucle APP.EXEC ().

Il n'y a pas de deuxième fil dans votre programme. Les événements sont livrés de manière asynchrone par le système d'exploitation, c'est pourquoi il semble qu'il y ait quelque chose d'autre. Il y a, mais pas dans votre programme.


2 commentaires

Il reste toujours une chose: si la boucle d'événement principal est occupée à obtenir des événements du système, qui les génère? Comment le signal newconnection () jamais émis, si la boucle principale est occupée à attendre dans cette boucle?


@ HARSHATH.JR - Je n'ai pas utilisé Qtcpserver avant, mais à partir de la documentation, on dirait qu'il demande au système d'exploitation de livrer des événements TCP à votre programme. Lorsque votre programme traite cet événement TCP, le QTcSperserver fait ce dont il a besoin, puis émet une nouvelle-nord ().