Seite 1 von 1

QThread und QTableWidget

Verfasst: 16. Juni 2009 00:03
von mf2
Hallo Leute,

Ich verwende einen QThread, um ein QTableWidget zu durchsuchen.
Wie folgt der Quelltext:

Code: Alles auswählen

searchThread::searchThread( QTableWidget *aTable )
{
	mTable = aTable;
}

void searchThread::startSearch( QString aQuery )
{
	mQuery = aQuery;
}

void searchThread::run()
{
	for( int i=0; i<mTable->rowCount(); i++ )
	{
		qDebug() << i;
		mTable->setRowHidden( i, !mTable->item( i,0 )->text().contains( mQuery, Qt::CaseInsensitive ) );
	}
}
Wie folgt wird der Thread benutzt:

Code: Alles auswählen

searchThread *st = new searchThread(table);
st->startSearch( "bla" );
st->start();
Der Code funktioniert soweit, allerdings verabschiedet sich das Programm völlig zufällig bei manchen Suchvorgängen verabschiedet:
Unhandled exception at 0x65349658 (QtGuid4.dll) in Crix.exe: 0xC0000005: Access violation reading location 0xfeeefef2.

Ich habe festgestellt, dass QTableWidgetItem::text() die exception verursacht, aber mir ist unklar warum, da dies auch völlig zufällig geschieht.

Wenn ich den Suchen-Code (also die for-Schleife) außerhalb des Threads benutze, funktioniert er wunderbar ohne Exception.

Hat jemand da eine Idee, woran das liegen könnte?

Verfasst: 16. Juni 2009 07:39
von franzf
Und du hast dir schonmal den Output deines Programms auf der Konsole angeschaut?

Das Problem ist halt einfach, dass du auf Gui-Elemente nur aus dem Hauptthread zugreifen kannst. QtGui wird deshalb auch nicht Threadsafe sein. Und wenn 2 Elemente gleichzeitig auf ein Element zugreifen, am besten das eine lesend und das andere schreibend, ist das nix gut.

Verfasst: 16. Juni 2009 08:51
von solarix
franzf hat recht: fast alle Methoden von Qt-Klassen sind zwar reentrant, aber nicht threadsafe. Ausserdem darf nur der Hauptthread (Thread 0) GUI-Operationen durchführen.
Mit anderen Worten: Mit deinem Thread darfst du sowas nicht tun.
Ich frage mich allerdings auch, ob da nicht auch noch ein konzeptionelles Problem herrscht.. Denn fallst du wirklich so grosse Datenmengen hast. solltest du dich mit folgenden Punkten befassen:

1. Aufteilung in Model (QAbstractItemModel) und View (QTableView)
2. Behandlung der Suche direkt im Model (entweder mit oder ohne Thread)

hth...

Verfasst: 28. Juni 2009 02:04
von mf2
Hallo,

Entschuldigt, dass ich erst jetzt antworte, die Benachrichtigungsmail wurde fälschlicherweise als Spam eingestuft.

Mittlerweile bin ich wirklich dazu übergangen, die Daten von einem QTableView anzeigen zu lassen, die Suche erledigt das QFilterProxyModel (oder wie das gleich heißt), nichtsdestotrotz vielen Dank für eure Antworten!