2016-01-29 2 views
1

Voilà un morceau de la Threads and QObjects doc de Qtémission de signaux et de l'exécution Qt QThread flux

de connexion directe La fente est appelée immédiatement, lorsque le signal est émis . La fente est exécutée dans le fil de l'émetteur, qui n'est pas forcément le fil du récepteur.

Alors nous allons admettre que je suis coincé dans un

while (this->true_bool); 

en fil 1 et thread2 émet un signal, relié à une fente de l'objet « this » de la ligne ci-dessus, sera-t exécutée après la sortie de la boucle (donc jamais) ou sera-t-elle exécutée immédiatement et après le retour de la machine, elle retournera dans le temps (donc si je change ceci-> true_bool à false cela mettra fin à la boucle)?

Il me semble étrange que cela provoque un appel immédiat de la machine à sous mais les docs semblent dire cela.

Répondre

3

Il sera exécuté immédiatement dans le thread2, indépendante de la boucle dans le thread1.

... L'emplacement est exécuté dans le fil de l'émetteur, ce qui est nécessairement le fil du récepteur ...

EDIT: Je pense que cette réponse au sujet QThread sera utile pour vous : https://stackoverflow.com/a/35056527/4149835

2

Qt appelle le travail comme suit:

  • connexion directe. Chaque fois que vous avez une connexion directe, l'appel emit fait ce qui suit: énumérer tous les slots connectés et les appeler un par un. Les slots sont des fonctions et ils sont appelés immédiatement pendant l'appel emit. Ainsi, une fois terminé emit Something(), tous les emplacements directement connectés à celui-ci ont été exécutés. Pensez-y comme un tableau de pointeurs de fonction qui sont exécutés un par un pendant l'appel. Donc tous les slots sont exécutés sur le même thread que vous appelez le signal.
  • Connexion en attente. Il est similaire à la connexion directe, mais au lieu d'appeler directement chaque emplacement, il est enregistré dans la file d'attente de l'objet associé à chaque emplacement. Par conséquent, l'emplacement est exécuté par la boucle d'événements à laquelle l'objet cible est associé. Et donc il est exécuté par le thread dans lequel l'objet cible vit et non par celui sur lequel le signal a été appelé (dans le cas où les threads pour l'objet cible et l'appel de signal ne sont pas les mêmes). Ainsi, lorsque l'appel de signal se termine, cela signifie que pour toutes les connexions en file d'attente QEvents ont été enregistrées dans les files d'attente appropriées, mais cela ne signifie pas que les emplacements ont été encore exécutés.