update() verzögert auf zweitem Fenster.

Alles rund um die Programmierung mit Qt
Antworten
oracle
Beiträge: 20
Registriert: 6. März 2009 18:59

update() verzögert auf zweitem Fenster.

Beitrag von oracle »

Hallo,


Ich habe ein ganz simple und wohl eine ziemlich dämliche Frage: Wie kann ich auf einem externen, zweiten Fenster Informationen in Echtzeit anzeigen?

In mehreren automatischen Schritten ( .. ohne user interaktion ) werden Bildveränderungen durchgeführt, die Veränderungen werden nach jedem Schritt auf meinem Hauptfenster angezeigt. Nun möchte ich zusätzlich ein weiteres Fenster öffnen und dort Informationen wie Histogramm und weitere Statistiken anzeigen. Diese werden zwar angezeigt .. allerdings erst wenn die ganze Bearbeitung durch ist, und nicht wie gewünscht nach jedem Schritt.

Dabei erstelle ich ein neues QWidget mit dem Qt::Window Flag, übergebe nach jedem Schritt die Infos die ich haben will, und versuche ein update() / repaint(). Diese werden allerdings NICHT ausgeführt.

Woran mag das liegen? / Oder anders: wie würdet ihr sowas realisieren? ( .. sollte ja wohl nicht so ne Sache sein, oder? )
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Eigentlich zu wenig Info ;)
Aber ich bin mir sicher, dass du deine Bildbearbeitung nicht in einem eigenen Thread durchführst.
Das Problem ist, dass deine Routine in einem großen Rutsch durchgeführt wird. Das blockiert die Event-Queue, wodurch wartende events erst abgearbeitet werden, wenn deine komplette Bildbearbeitung durch ist. Darum gibts auch erst dann ein Update deines Histogramms.
Am besten du separierst jeden Bearbeitungsschritt in ne eigene Funktion/Klasse. Wenn die Berabeitung fertig ist, gibts ein SIGNAL finished(), an das sich dein Hsitogram->update() hängt.
Dann kann das HistogramWidget selber ein signal updateFinished() senden, woraufhin du den nächsten Bearbeitungsschritt startest.
Darunter leidet aber die Geschwindigkeit der Bildbearbeitung, wenn diese immer wieder unterbrochen wird.

Am besten nimmst du deshalb für die Bearbeitung nen eigenen Thread. Dort kannst du nach jedem Bearbeitungsschritt ein Signal versenden, welches in der main-EventLoop verarbeitet wird, und es kann gleich weiter bearbeitet werden.
oracle
Beiträge: 20
Registriert: 6. März 2009 18:59

Beitrag von oracle »

ok, merci für die Antwort.

ich versuche das nun mal.
Antworten