Fragen zum Anwendungsdesign bei Threads und Signalen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Guten Morgen!

Ich habe da eine Frage zu dem Design einer Anwendung.

Folgendes Szenario:
Aus einer Quelle, die unterschiedlich schnell liefert, bekomme ich Daten. Immer wenn ein Datensatz eingetroffen ist möchte ich den Benutzer darüber informieren.
Im Hintergrund laufen dann aber verschiedene Dinge ab, die mit diesem Datensatz passieren. Je nach Datensatz kann das unterschiedlich lange dauern, deshalb habe ich das in einen eigenen Thread ausgelagert. Diesen Vorgang möchte ich für den Benutzer durch Änderungen der dargestellten Informationen sichtbar machen.

Ich gehe bisher wie folgt vor:
In einem Fenster gibt es ein QListWidget, an das ein Item angefügt wird sobald ein Datensatz vollständig angekommen ist. Der Benutzer weiß also Bescheid, dass es einen neuen Datensatz gibt.
Das Item besitzt einen Slot, der mit einem Thread verbunden wird, der die Items in einer Queue sammelt und nacheinander abarbeitet.
Sobald der Thread bestimmte Punkte in der Abarbeitung erreicht, sendet er das Signal, das den Slot im Item aufruft und dort Änderungen an den dargestellten Informationen vornimmt.

Die Frage ist, wie mache ich das am "günstigsten"?

Wenn ich jedes Item mit dem selben Signal mit dem Thread verbinde, dann würde ja jedes Item dieses Signal empfangen und müsste prüfen ob es überhaupt selbst gemeint ist. Das könnten irgendwann sehr viele Items werden, die dann unnötig aktiviert werden.

Ich könnte auch für jedes Item ein extra Signal erstellen und den Namen für das Signal z.B. aus dem Hash des Items generieren. Dann wäre der Empfänger des Signals eindeutig, dafür gibt es irgendwann sehr viele Signale im System. Um das zu verhindern könnte ich höchstens versuchen die Signale sauber wieder zu trennen nachdem der Thread definitiv die Arbeit für das Item beendet hat.

Die nächste Möglichkeit wäre in dem Hauptfenster, dass die Items kennt, den Slot einzubauen und dort die Verarbeitung vorzunehmen.

Ich tendiere zu 3, habe aber Angst weitere Möglichkeiten übersehen zu haben ;)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@sparrow:
Für mich hört sich das hiernach an:
- erstelle Itemexemplar
- erstelle neues Threadexemplar zum Bearbeiten der Daten (hat update-Signal)
- verbinde update-Signal des Threadexemplars mit Slot des Itemexemplars
- starte Thread
BlackJack

@jerch: Deins klingt jetzt irgendwie nach ein Thread pro Item, so habe ich den ersten Beitrag aber nicht verstanden, dort gibt es einen Thread für alle Items und die werden nacheinander in diesem Thread abgearbeitet.

Also aus meiner Sicht eher ein Objekt im Hauptthread das alle Items kennt mit einem Slot für ”Item fertig” der ein Item oder eine ID als Argument nimmt was dieses Objekt dann nutzen kann um genau dieses Item in der GUI zu aktualisieren und ein Arbeitssthread der ein Signal hat was immer feuert wenn ein Item fertig ist, mit diesem Item (oder einer ID dafür) als Parameter.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@BlackJack:
War mir nicht sicher, ob die "Ein-Thread"-Sache Absicht war, daher hab ichs nassforsch umgedeutet :D

@sparrow:
Wenn die serielle Abarbeitung der Items in einem Subthread erwünscht ist, macht ein Verwaltungsobjekt im Hauptthread mehr Sinn.
Antworten