Attualmente sto cercando di imparare il networking con Python asyncore e pyqt4.QObject (QPlainTextEdit) e problemi di multithreading
Ho codificato un piccolo server, che in pratica ascolta alcune porte e invia di nuovo tutti i messaggi ricevuti al mittente.
Poiché entrambe qt QApplication.exec_()
e asyncore.loop()
sono funzioni che non ritorno ho non entrambi potuto iniziare in un thread, così fissai asyncore.loop()
in un thread daemon separato.
Ogni volta che la mia classe di server (derivato da asyncore.dispatcher
) stabilisce o elimina un collegamento, o invia/riceve un messaggio, chiama i metodi della mia classe di finestra (derivato da QtGui.QMainWindow
), che visualizza le informazioni in un QPlainTextEdit
.
Ma il testo non è visibile, a meno che non si contrassegna il testo con il mouse.
Python console display seguenti msg di errore:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
ho letto su alcuni forum, che questo può essere causato da chiamando qt-funzioni da un altro thread, e che utilizzano segnali & fessure al posto della funzione pianura chiamata può risolvere il problema, ma ho provato anche i segnali, e ho ancora questo errore.
Quindi, (se questo è davvero la causa dei miei problemi) qual è il modo corretto per chiamare i metodi di un oggetto qt da un altro thread?
EDIT Ulteriori informazioni: l'asyncore.loop() chiamata si trova nel thread figlio, così non è davvero il blocco, ma solo durante il tempo di esecuzione asyncore.loop() mia classe Server (asyncore.dispatcher) può fare networking. Quindi, durante il runtime di asyncore.loop() i metodi della mia classe Server sono chiamati da asyncore.loop() (= thread figlio), e in questi i ha provato ad emettere segnali alla classe della finestra in esecuzione nel thread principale
EDIT: Sembra che l'ho fatto funzionare ora, ho avuto alcuni errori nel mio codice, tutto funziona come previsto con i segnali ora.
EDIT: piccolo esempio: http://paste2.org/p/635612 (link morto)
Puoi pubblicare una spiegazione o uno snippet della soluzione di lavoro? Sicuramente aiuterebbe gli altri con lo stesso problema in futuro. =) –