QThread und QTableWidget

Alles rund um die Programmierung mit Qt
Antworten
mf2
Beiträge: 4
Registriert: 3. Januar 2006 00:17

QThread und QTableWidget

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
mf2
Beiträge: 4
Registriert: 3. Januar 2006 00:17

Beitrag 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!
Antworten