Laden...

GUI ist träge; bei der Anzeige großer Bilder

Erstellt von BrainBug22 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.138 Views
B
BrainBug22 Themenstarter:in
51 Beiträge seit 2008
vor 13 Jahren
GUI ist träge; bei der Anzeige großer Bilder

Hallo,

ich habe folgendes Problem:

Ich arbeite mit großen Bilddaten, die zyklisch aktualisiert in mehreren Controls auf der Haupt-Form meiner Anwendung angezeigt werden.
Die Daten werden zwar in separaten Threads verarbeitet, die Anzeige wird allerdings gezwungenermaßen an die Haupt-Form delegiert.

Mein Problem liegt darin, dass wenn das Display-Update durchgeführt wird, dieses wegen der großen Bilddaten relativ lange dauert und die GUI solange alle Maus-Events u.ä. verzögert.
Wenn man beispielsweise einen Button drückt, kann es vor kommen, dass die Reaktion erst 0,5 Sekunden später erfolgt. Dies führt zu einem schlechten Bedienkomfort, die Bedienung läuft "nicht rund".

Was kann man da machen? Oder sind das die Grenzen von Windows-Forms?

D
99 Beiträge seit 2011
vor 13 Jahren

Lädst du denn alle Bilder gleichzeitig? Und ist es nötig alle gleichzeitig zu laden? Ansonsten könnte man doch versuchen mit Timern nach und nach die Bilder zu laden!? Ist das eine möglichkeit? Sonst sehe ich da schwarz. Irgendwo sind auch die Grenzen.

//Edit: tastatur ist defekt... fehlende Buchstaben korrigiert

Ein guter Rat ist nur ein guter Rat für den, der ihn braucht.

60 Beiträge seit 2008
vor 13 Jahren

hi

Evtl. eine Art "Voransicht" (mit geningerer Auflösung; entspr. des Bildschrims) im Hintergrund generieren; klar das darf natürlich nicht im GUI-Thread passieren...

S.

A
118 Beiträge seit 2009
vor 13 Jahren

Ich arbeite mit großen Bilddaten, die zyklisch aktualisiert in mehreren Controls auf der Haupt-Form meiner Anwendung angezeigt werden.

Wenn es mehrere Bilder sind, die gleichzeitig angezeigt werden, können sie ja nicht so gross sein. Um wieviele und wie grosse Bilder handelt es sich? Was für Controls verwendest du?

Mfg
Aratar

B
BrainBug22 Themenstarter:in
51 Beiträge seit 2008
vor 13 Jahren

Die Bilder werden 2x pro Sekunde angezeigt.
Die Bildgröße liegt in der Regel bei max. 8000x6000 Pixeln.
Das verwendete Control einer Bildverarbeitungsbibliothek skaliert die Bilddaten auf die Anzeigeauflösung runter.
Dieser Vorgang nimmt sich wahrscheinlich auch die meiste Zeit.
Die Bilder können auch nicht im Hintergrund skaliert werden, da dann die weiteren Funktionen des Controls nicht mehr funktionieren würden (Zoom, Overlays, usw.)

Ich habe hier 8 Prozessorkerne zur Verfügung und kann sie nicht nutzen (zumindest nicht für die Anzeige)
Schade, dass auf Controls ausschließlich im GUI-Thread zugegriffen werden kann...

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

die GUI kannst du nur von einem Thread bauen.
Aber das Bilder runterskalieren kannst du auch genauso in Threads auslagern.

Siehe dazu: [FAQ] Warum blockiert mein GUI?

Nur die normalen Bilder anzeigen ist für den GUI-Thread in der Regel kein Problem.
Aber wenn er durch das Skalieren auch noch blockiert wird dann hängt er sich immer mehr auf

Gruß
Michael

B
BrainBug22 Themenstarter:in
51 Beiträge seit 2008
vor 13 Jahren

Das Problem ist, dass ich keinen Einfluss auf die Arbeitsweise des Controls habe. Ich rufe eine Control-Methode zum Anzeigen des Bildes mit den Bilddaten als Parameter auf - den Rest macht das Control (Skalierung usw.)

Wenn ich diese Methode aus einem Thread heraus aufrufe, gibt's Ärger, da das Ding nicht threadsafe ist.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Wenn du das so machen willst, musst du eben damit leben.
Oder aber du hörst darauf, was michlG sagt und du skalierst das Bild selber.

B
BrainBug22 Themenstarter:in
51 Beiträge seit 2008
vor 13 Jahren

OK, ich lasse mir das mal alles durch den Kopf gehen.
Vielen Dank an alle!

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Pegasus22,

grundsätzlich sehe ich es wie FZelle. Zusätzlich sehe ich noch eine dritte Möglichkeit: Wende dich an den Hersteller der Controls und bitte darum, dass sie die Controls so ändern, dass eine Blockierung des GUIs durch das Control selbst ausgeschlossen wird (sprich dass sie für das Skalieren intern Threads verwenden).

herbivore