Domanda

Ho notato che quando la funzione setModel viene eseguita in thread parallelo ( Ho provato threading.Timer o threading.thread), ottengo questo:

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

C'è un modo per risolverlo?

È stato utile?

Soluzione

È davvero un dato di fatto che l'uso multithread di Qt (e di altri framework ricchi) è un lavoro delicato e difficile, che richiede attenzione e cura esplicite - vedi documenti di Qt per un'eccellente copertura dell'argomento (per i lettori esperti nel threading in generale, con letture consigliate per coloro che non lo sono ancora).

Se possibile, suggerirei ciò che suggerisco sempre come architettura più solida per il threading in Python: lasciare che ogni sottosistema sia di proprietà e utilizzato da un singolo thread dedicato; comunicare tra i thread tramite istanze di Queue.Queue , ovvero passando i messaggi. Questo approccio può essere un po 'restrittivo, ma fornisce una buona base su cui sono state identificate e attentamente progettate eccezioni (basate su pool di thread, nuovi thread occasionali generati, blocchi, variabili di condizione e altre cose così difficili ;-). In quest'ultima categoria classificherei anche cose specifiche di Qt come la comunicazione cross-thread segnale / slot tramite connessioni in coda .

Altri suggerimenti

Sembra che ti sia imbattuto in una limitazione Qt lì. Prova a usare segnali o eventi se hai bisogno di oggetti per comunicare tra thread.

Oppure chiedi alla gente di Qt di questo. Non sembra specifico per PyQt.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top