QSqlQueryModel, QTableView und QThread

Alles rund um die Programmierung mit Qt
Antworten
miki11
Beiträge: 30
Registriert: 27. Oktober 2008 13:32

QSqlQueryModel, QTableView und QThread

Beitrag von miki11 »

Es geht um Qt 4 und c++

Ich habe einen Model mit QSqlQueryModel und zeige dieses mit QTableView an. Es kommt jedoch schonmal vor, daß das Query etwas Zeit braucht. Während dessen hängt mein GUI.

Ich habe mich jetzt schon durch viele Seiten gesucht, aber irgendwie komme ich nicht zurecht.

Wie realisiere ich das, damit mein GUI nicht blockiert?

QThread ist schön und gut, ich kann ja die Abfrageergebnisse in das GUI Thread rüber?

Brauche ich in beide Threads ein Model und lasse über einen Pipe die Daten nach der Abfrage kopieren? Oder wie stelle ich das am geschicktesten an?

Hat jemand eine Seite mit Beispiel für so was?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Im Thread eine QSqlQuery und per Signal/Slot die Daten in den Haupt-Thread rüberkopieren.
miki11
Beiträge: 30
Registriert: 27. Oktober 2008 13:32

Beitrag von miki11 »

upsala hat geschrieben:Im Thread eine QSqlQuery und per Signal/Slot die Daten in den Haupt-Thread rüberkopieren.
sqlquery, also nicht model?

also querythread1 beinhaltet das Ergebniss von der Abfrage im Thread1
Wenn Abfrageergebniss vorliegt, erzeuge ich den signal vom thread1.

Threadmain (GUI) reagiert darauf und kopiert die Daten von querythread1 in das Model für View.

Sehe ich das so richtig?

bzw. bevor kopiervorgang anfängt müsste ich noch einen Lock erstellen und am Ende Lock freigeben.

Währe das möglich das Result von QSqlQuery an QSqlQueryModel zu übergeben? Oder müsste ich das selber implementieren?

PS: ich finde es super, wie schnell du immer antwortest, besten Dank für all deine Hilfe!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Locks sind nicht notwendig, wenn die Signale über Thread-Grenzen gehen.
Das QSqlResult würde ich nicht übergeben. Da dieses an den Treiber gebunden ist und SQL-Treiber nicht unbedingt Thread-Safe sind. Am einfachsten wäre es eine QVariant-Liste/Map zu übergeben.
miki11
Beiträge: 30
Registriert: 27. Oktober 2008 13:32

Beitrag von miki11 »

upsala hat geschrieben:Locks sind nicht notwendig, wenn die Signale über Thread-Grenzen gehen.
Wenn aber von einen weiteren Thread auf diesen Aufruf zugegriffen werden sollte? (Ich weiß noch nicht, ob das statt finden wird, aber wenn...) Dann währe das notwendig, oder gibt es da andere sinnvolle Lösungen?

Signale zwischen Threads geht genauso, wie Thread frei? Oder gibt es da auch was zu beachten?
upsala hat geschrieben:Das QSqlResult würde ich nicht übergeben.
Stimmt, blöde Frage von mir. Das habe ich ja schon mal gemacht, und das Ergebnis gesehen... :shock:
upsala hat geschrieben:Am einfachsten wäre es eine QVariant-Liste/Map zu übergeben.
OK, versuche ich auf diesen Weg.

Aber noch eine weitere Frage. Hast du irgendwelche gute Dokumentationsvorschläge, die solche Themen tief gehend behandelt? Ich arbeite mit dem Buch http://www.galileocomputing.de/katalog/ ... 4-If5-GRx4
Wo ich eine sehr gute Grundlage erlernen konnte, Jahrelange C und Assembler Kenntnisse habe ich auch, aber alles nur mit einem Ablauf. Threads verstehe ich zwar dahingehend, daß sie einen Code- zwei Datenbereiche haben (das kenne ich von fork), aber ich habe starke Defizite, wenn es darum geht Qt Objecte und Threads zu behandeln.

Kennst du Beispiele, Docs, Internetseiten, die solche Themen behandeln? Oder bleibt da nur das durchfragen hir im Forum und selber ausprobieren?
Antworten