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?
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.
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.
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
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...
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
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.
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.
OK, ich lasse mir das mal alles durch den Kopf gehen.
Vielen Dank an alle!
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