2010-08-03 2 views
1

Je travaille sur une application Qt multi-thread et j'aimerais connecter un signal dans un thread avec slot dans un autre thread. Mon problème est que je n'ai que la chaîne utilisée pour définir le QObject:objectName dans le thread de signalisation qui est défini dans un fichier constantes de projet.Recherche d'un objet QObject

Mon objectif global est d'éviter de devoir passer des pointeurs vers des objets situés à plusieurs couches au sein d'autres objets. Je l'ai fait par le passé et même si cela fonctionne, cela ajoute beaucoup de complexité au code. Et c'est une solution très peu élégante au problème.

Ce que je voudrais faire est de faire une recherche globale à travers tous les QObjects dans mon application pour trouver celle qui correspond au nom. En lisant la documentation de Qt, il y a beaucoup de discussions sur la façon de rechercher des objets enfants de l'actuel ou vous pouvez rechercher en utilisant des classes parentes. Mais avec des objets dans différents threads, cela ne semble pas fonctionner. En particulier, comme l'objet qui effectue la connexion n'a pas un accès direct au QThread qui possède l'objet faisant la signalisation.

Des suggestions?

Répondre

1

Les arbres d'objets doivent tous appartenir au même fil. La description détaillée des états QObject:

Utilisez la fonction moveToThread() pour modifier l'affinité de thread pour un objet et ses enfants

Je l'ai vu une solution intéressante au problème de trouver des objets mis en œuvre dans Qt Creator: son plugin manager has a global object registry où vous pouvez ajouter et supprimer des objets et de les interroger plus tard par type. Il serait facile de l'étendre et de permettre l'interrogation par nom aussi. Rappelez-vous juste que les noms n'ont pas besoin d'être uniques.

+0

Lien très intéressant. Merci! –

1

vous pourriez écrire votre propre nom => carte d'objet. Les classes de conteneur de Qt sont sûres pour les threads.

+1

En examinant la documentation de Qt, je vois qu'ils sont tous réentrants, cependant, je n'ai pas vu la documentation dire que les conteneurs sont thread-safe. La semaine dernière, je travaillais avec QQueue dans une application multi-thread et j'ai raté un mutex. Il a fallu du temps pour comprendre pourquoi j'avais parfois des données indésirables provenant de QQueue. Donc, basé sur mon expérience, je ne serais pas d'accord que les conteneurs Qt sont thread-safe. –

Questions connexes