2008-09-09 10 views
1

Est-ce que quelqu'un sait comment le gestionnaire d'événements gère les événements affichés?Gestionnaire d'événements dans Qt avec multithread

Dans mon application j'ai deux fils (guiThread et computationThread). Après qu'une exception est levée, j'appelle postEvent(..) à une boîte de dialogue existante. Le gestionnaire d'événements Qt retient celui-ci jusqu'à ce que la boîte de dialogue soit fermée.


Désolé, ma question est un peu claire. Je vais l'écrire plus exactement, s'il me reste du temps. J'ai trouvé un travail autour. Mais pour moi le problème est toujours intéressant.

Répondre

2

Comme mentionné dans la documentation Qt environ QCoreApplication::postEvent:

Lorsque la commande revient à la boucle d'événement principal, tous les événements qui sont stockés dans la file d'attente sont envoyés en utilisant la fonction notify().

... ce qui explique pourquoi le gestionnaire d'événements Qt maintient l'événement jusqu'à la fermeture de la boîte de dialogue.

Si je comprends bien ce que vous voulez faire, j'essaierais d'utiliser sendEvent.

1

Je suppose que la boîte de dialogue que vous avez créée est modale, ce qui signifie qu'elle exécute sa propre boucle d'événements. Aucun événement publié dans le fichier guiThread général ne sera traité jusqu'à ce que toutes les boucles d'événements modaux soient fermées.

Alternativement, si vous avez besoin que la boîte de dialogue soit à la fois modale et que vous connaissiez l'événement, vous pouvez publier l'événement directement dans la boîte de dialogue. Vous aurez besoin de comprendre comment gérer les pointeurs de manière partagée, mais si rien de compliqué ne se passe, vous pourriez utiliser la fonction QApplication :: activeWindow().

0

Comme d'autres l'ont déjà écrit, je crois que ce comportement est dû au fait que le dialogue démarre sa propre boucle d'événements.

Si vous utilisez Qt4, vous pouvez essayer d'utiliser queued signal/slot connections comme alternative à la publication d'événements.