L'histoire:
Je fais usage de l'API QtConcurrent pour chaque "longue" opération dans mon application. Cela fonctionne plutôt bien, mais je rencontre des problèmes avec la création de QObjects.Un moyen de détecter si un QObject appartient à un QThread "mort"?
Considérez ce morceau de code, qui utilise un fil pour créer un « Foo » objet:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
return result;
});
Il fonctionne bien, mais si la classe est dérivée de la classe QObject « Foo », le « résultat » L'instance appartient à QThread qui a créé l'objet.
Donc, pour utiliser le signal correctement/emplacement avec l'instance « résultat », il faut faire quelque chose comme ceci:
QFuture<Foo*> = QtConcurrent::run([=]()
{
Data* data = /*long operation to acquire the data*/
Foo* result = new Foo(data);
// Move "result" to the main application thread
result->moveToThread(qApp->thread());
return result;
});
Maintenant, tous les travaux que exepected, et je pense que cela est le comportement normal et la valeur nominale Solution.
Le problème:
J'ai beaucoup de ce genre de code, qui créent parfois des objets, qui peuvent également créer des objets. La plupart d'entre eux sont créés correctement avec un appel "moveToThread".
Mais parfois, un appel "moveToThread" me manque.
Et puis, beaucoup de choses semblent ne pas fonctionner (parce que ces emplacements d'objets sont "cassés"), sans aucun avertissement Qt.
Maintenant, je passe parfois beaucoup de temps à comprendre pourquoi quelque chose ne fonctionne pas, avant de comprendre que c'est uniquement parce que les emplacements ne sont plus appelés sur une instance d'objet particulière.
La question:
Est-il possible de me aider à prévenir/detect/debug ce genre de situation? Par exemple:
- ayant un avertissement connecté à chaque fois qu'un QThread est supprimé, mais il y a des objets vivants qui lui appartient?
- Avoir un avertissement enregistré chaque fois qu'un signal est émis à un objet QThread est supprimé?
- Avoir un avertissement enregistré chaque fois qu'un signal est émis sur un objet (dans un autre thread) et non traité avant un timeout?
Merci
Y at-il une raison que le 'type foo' 'QObject 's doivent avoir une affinité de thread non-principal (ce que je pense que vous voulez dire par" appartient à ")? – eclarkso
La troisième question est un doublon; veuillez l'enlever. Vous demandez comment détecter une boucle d'événement bloquée - ceci est indépendant de l'émission d'un signal. Voir [ici] (http://stackoverflow.com/q/25038829/1329652). –