Question

J'ai remarqué que lorsque la fonction setModel est exécutée dans un thread parallèle ( J'ai essayé threading.Timer ou threading.thread), je reçois ceci:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QHeaderView(0x1c93ed0), parent's thread is QThread(0xb179c0), current thread is QThread(0x23dce38)
QObject::startTimer: timers cannot be started from another thread
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTreeView(0xc65060), parent's thread is QThread(0xb179c0), current thread is QThread(0x23dce38)
QObject::startTimer: timers cannot be started from another thread

Y at-il un moyen de résoudre ce problème?

Était-ce utile?

La solution

En réalité, l’utilisation multithread de Qt (et d’autres riches cadres) est un travail délicat et difficile, qui requiert une attention et des soins explicites - voir La documentation de Qt pour une excellente couverture du sujet (pour les lecteurs expérimentés dans le filetage en général, avec des lectures suggérées pour ceux qui ne le sont pas encore).

Si vous le pouvez, je suggérerais ce que je propose toujours comme architecture la plus solide pour les threads en Python: laissez chaque sous-système appartenir à et utilisé par un seul thread dédié; communiquer entre les threads via des instances de Queue.Queue , c’est-à-dire en transmettant des messages. Cette approche peut être un peu restrictive, mais elle fournit une bonne base sur laquelle des exceptions spécifiquement identifiées et soigneusement architecturées (basées sur des pools de threads, de nouveaux threads générés occasionnellement, des verrous, des variables de condition, etc.) ;-). Dans cette dernière catégorie, je classifierais également des éléments propres à Qt, tels que la communication de signal / slot inter-thread via connexions en file d'attente .

Autres conseils

On dirait que vous avez laissé tomber une limitation de Qt. Essayez d’utiliser des signaux ou des événements si vous avez besoin que les objets communiquent entre les threads.

Ou demandez aux gens de Qt à ce sujet. Cela ne semble pas spécifique à PyQt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top