Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Form.Resize während einem Synchronize / Thread-Handling (https://www.delphipraxis.net/211322-form-resize-waehrend-einem-synchronize-thread-handling.html)

swestner 30. Aug 2022 00:31

Form.Resize während einem Synchronize / Thread-Handling
 
Hallo,

ich habe ein etwas kniffeliges Problem und vielleicht hat jemand eine Idee, wie das zu lösen ist.

Plattfrom: Delphi 11.1, Firemonkey unter Windows

Programm startet und zeigt ein Form an.
Jetzt startet ein Thread, dieser berechnet aus einer Menge Daten ein Grafik.
Wenn der Thread die Grafik fertig gerechnet hat, ruft er einen Callback auf.
In diesem Callback mache ich ein Synchronize und rendere damit dann im Hauptthread die berechnete Grafik auf's Form.

Das funktioniert soweit.

Allerdings kann der Benutzer das Hauptform auch vergrößern.

Wenn das Form z. B. 600 Pixel breit und 400 Pixel hoch ist dann wird die Grafik auf diese Größe ins Form gerendert.

Jetzt zieht der Benutzer das Form größer, dann stoppe ich den Hintergrundthread (eine laufende Berechnung ist ja jetzt hinfällig) und starte den mit den neuen Form-Größen neu.

Jetzt kommt das Problem:
Der Thread ist fertig mit rendern und ruft den Callback auf.
Im Callback rufe ich Synchronize auf und zeichne die Grafik auf's Form.
Genau in dem Moment des Zeichnens zieht der Benutzer aber das Form größer.
Im Resize versuche ich jetzt den Hintergrundthread zu stoppen, was aber nicht klappt, da der ja im Callback im Synchronize die Grafik neu zeichnet.

Wie löst man sowas?
Und warum kann ich überhaupt das Form resizen wenn die Applikation durch das Abarbeiten des Callbacks eigentlich gar nicht im On-Idle ist?

Grüße

Stefan

himitsu 30. Aug 2022 01:39

AW: Form.Resize während einem Synchronize / Thread-Handling
 
Eine der beiden Seiten muß asynchron arbeiten.

entweder der Thread nutzt kein Synchronize oder das Abbrechen/Beenden wird nicht blockierend gemacht.

am Einfachsten:
* der Thread gibt sich selbst frei (FreeOnTerminate)
* das Stoppen wird nur signalisiert (nicht gewartet) ... z.B. Thread.Terminate
* der neue Thread kann schon gesartet werden, während der Alte sich noch in Ruhe beenden kann

oder
* wenn der noch laufende Thread auf das "Neuberechnen"-Signal reagiert (nach dem Synchronize) und z.B. in einer Schleife (oder Goto) wieder hoch springt und die Berechnung neu startet, dann braucht es keinen neuen Thread


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz