[gelöst] QStandardItemModel durch anderen Thread füllen
Verfasst: 23. Juni 2008 19:08
Da ich da jetzt mehrere Stunden mit dem Loesen meines Problems verbracht habe, und ich das anderen ersparen moechte, werde ich hier mal eben mein Problem mit Loesung schildern:
Ich habe ein Programm, welches einen Arbeiter-Thread hat. In diesem Laeuft die Datenbank mit einer Art Vermittlungsklasse, welche alle noetigen SQL-Anweisungen anthaelt. Ueber letztere greifen dann alle anderen Objekte auf die Datenbank zu.
Die Gui laeuft in einem anderen Thread und benutzt QTableViews um Datenbank-Abfragen anzuzeigen. Dabei uebergibt ein Gui-Objekt einen Zeiger auf ein QStandardItemModel an die Vermittlungsklasse im anderen Thread, welche dann das Model mit Daten befuellt.
Dabei ist es wichtig, dass die Zeigeruebergabe an die Vermittlungsklasse ueber eine QueuedConnection geht.
Evtl ist dabei noch die Zeile
notwendig.
Es kam nun zu Anzeigefehlern und sporadischen Abstuerzen mit der Meldung
Die Loesung:
Die Vermittlungsklasse teilt der Gui-Klasse mit, wenn sie fertig mit dem Befuellen des Models ist. Ich habe dies mit einem Signal geloest.
Erst dann darf das model mittels setModel der QTableView zugewiesen werden. Mein Fehler war, dass ich noch vor der Datenanfrage bei der Vermittlungsklasse quasi das noch leere model der QTableView zugewiesen habe. Offensichtlich werden dabei dann die Threads sehr oft zu einem unguenstigen Zeitpunkt schlafen gelegt.
Ich hoffe das hilft jemandem weiter.
Colonel
Ich habe ein Programm, welches einen Arbeiter-Thread hat. In diesem Laeuft die Datenbank mit einer Art Vermittlungsklasse, welche alle noetigen SQL-Anweisungen anthaelt. Ueber letztere greifen dann alle anderen Objekte auf die Datenbank zu.
Die Gui laeuft in einem anderen Thread und benutzt QTableViews um Datenbank-Abfragen anzuzeigen. Dabei uebergibt ein Gui-Objekt einen Zeiger auf ein QStandardItemModel an die Vermittlungsklasse im anderen Thread, welche dann das Model mit Daten befuellt.
Dabei ist es wichtig, dass die Zeigeruebergabe an die Vermittlungsklasse ueber eine QueuedConnection geht.
Evtl ist dabei noch die Zeile
Code: Alles auswählen
qRegisterMetaType< Qt::Orientation >("Qt::Orientation");Es kam nun zu Anzeigefehlern und sporadischen Abstuerzen mit der Meldung
Code: Alles auswählen
ASSERT: "i >= 0 && i < size()" in file ../../include/QtCore/../../src/corelib/tools/qbitarray.h, line 121
AbortedDie Vermittlungsklasse teilt der Gui-Klasse mit, wenn sie fertig mit dem Befuellen des Models ist. Ich habe dies mit einem Signal geloest.
Erst dann darf das model mittels setModel der QTableView zugewiesen werden. Mein Fehler war, dass ich noch vor der Datenanfrage bei der Vermittlungsklasse quasi das noch leere model der QTableView zugewiesen habe. Offensichtlich werden dabei dann die Threads sehr oft zu einem unguenstigen Zeitpunkt schlafen gelegt.
Ich hoffe das hilft jemandem weiter.
Colonel