2009-11-14 3 views
18

Si j'avais une classe A, où l'une de ses fonctions? ElleQt: Les événements sont-ils traités dans l'ordre?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

En supposant qu'une classe B dispose de 2 emplacements, un connecté à first_signal, et l'autre à second_signal, est-il garanti que la slot qui est connecté à first_signal sera toujours traité avant l'emplacement second_signal?

Répondre

15

Si vous utilisez un type de connexion directe entre les signaux et les emplacements (Qt :: DirectConnection), la réponse est oui.

À partir du système d'aide Qt:

Lorsqu'un signal est émis, les fentes connectés sont généralement exécutés immédiatement, comme un appel de fonction normale. Lorsque cela se produit, le mécanisme de signaux et d'emplacements est totalement indépendant de toute boucle d'événement GUI. L'exécution du code suivant l'instruction émettra une fois que tous les emplacements auront été renvoyés. La situation est légèrement différente lors de l'utilisation des connexions en file d'attente; dans un tel cas, le code suivant le mot-clé emit sera continuer immédiatement, et les tranches seront exécutées plus tard.

Vous pouvez modifier le type de connexion par défaut à l'une des enum Qt::ConnectionType dans la méthode QObject::connect.

+1

Je pense que ce serait garanti tant qu'ils ont le même type, même si ce n'est pas par défaut. La file d'attente créerait deux événements, chacun avec la même priorité, et ces événements seraient ensuite traités dans l'ordre. En outre, le type de connexion par défaut est Qt :: AutoConnection, qui se résout à diriger tant que l'émetteur et le récepteur sont dans le même thread. –

+3

La phrase de début de votre message devrait se lire 'Si vous utilisez le type de connexion DIRECT entre les signaux et les emplacements '; Le type par défaut est 'Qt :: AutoConnection' qui se comporte différemment selon que le code d'envoi et l'objet récepteur résident ou non dans des threads différents. Voir les documents ['Qt :: ConnectionType'] (http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum) et [Threads, Events et QObjects] (http: // qt- project.org/wiki/Threads_Events_QObjects). – Hossein

+2

Si vous avez choisi Qt :: QueuedConnection (ou Qt :: AutoConnection et que le slot était dans un thread différent du signal), bien sûr le slot serait appelé de manière asynchrone, mais je pense que la question est toujours "Est-ce garanti que le slot qui est connecté à first_signal sera toujours traité avant le slot second_signal? " Quelqu'un a-t-il une réponse? –

Questions connexes