Ошибка потока в Python & amp; PyQt
-
07-07-2019 - |
Вопрос
Я заметил, что когда функция setModel выполняется в параллельном потоке ( Я пробовал threading.Timer или threading.thread), я получаю это:
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
Есть ли способ решить эту проблему?
Решение
Действительно, многопотоковое использование Qt (и других богатых фреймворков) действительно является деликатной и сложной работой, требующей явного внимания и осторожности - см. документы Qt для отличного освещения предмета (для читателей, имеющих опыт работы с потоками в целом, с предлагаемыми чтениями для тех, кто еще этого не делает). р>
Если возможно, я бы предложил в качестве наиболее надежной архитектуры для создания потоков в Python то, что я всегда предлагаю: пусть каждая подсистема принадлежит и используется отдельным выделенным потоком; общаться между потоками через экземпляры Queue.Queue
, то есть путем передачи сообщений. Этот подход может быть немного ограничительным, но он обеспечивает хорошую основу для конкретных и тщательно спроектированных исключений (основанных на пулах потоков, случайных порождаемых новых потоках, блокировках, переменных условий и других подобных привередливых вещах ;-). В последней категории я бы также классифицировал специфичные для Qt вещи, такие как межпотоковая передача сигналов / слотов через соединения в очереди .
Другие советы
Похоже, вы попали в ограничение Qt. Попробуйте использовать сигналы или события, если вам нужны объекты для связи между потоками.
Или спросите об этом народ Qt. Это не кажется специфическим для PyQt.