![]() |
Controls sofort aktualisieren ohne ProcessMessages
Delphi XE 5 ; FireMonkey HD Anwendung ; Exklusiv für Windows
Ich hätte gerne ein paar Controls, die eine Rückmeldung an den User geben sollen, sofort aktualisiert. Ich habe das bisher nur mit einem
Delphi-Quellcode:
hinbekommen. Geht das auch ohne?
Application.ProcessMessages
Ich habe ein Minimalbeispiel dazu gestrickt:
Delphi-Quellcode:
unit Unit2;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Objects, FMX.Edit; type TForm2 = class(TForm) Label1: TLabel; Edit1: TEdit; Circle1: TCircle; procedure Edit1Change(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.fmx} procedure TForm2.Edit1Change(Sender: TObject); begin // Anzeige das etwas geschieht und etwas Zeit dauert Circle1.Fill := TBrush.Create(TBrushKind.bkSolid,TAlphaColorRec.Black); Label1.Text := 'Schwarz'; // gibt es eine Möglichkeit das ProcessMessages zu umgehen? FMX.Forms.Application.ProcessMessages; // sleep als Ersatz für eine etwas länger dauernde Prozedur sleep(2500); // fertig Circle1.Fill := TBrush.Create(TBrushKind.bkSolid,TAlphaColorRec.White); Label1.Text := 'Weiß'; end; end. |
AW: Controls sofort aktualisieren ohne ProcessMessages
Da FMX die GUI im Mainthread zeichnet wird es ohne Application.ProcessMessages nicht gehen.
Ich hatte zu dem Themenbereich mal einen Beitrag gestartet: ![]() Dort ist auch ein kleines Testprojekt, das mal eine "eigene primitive GUI" (zumindest ein paar sehr spartanische Controls) unabhängig vom Mainthread versucht. Zumindest ich hatte aus den Demovideos zu FMX anfänglich herausgelesen, dass FMX offenbar unabhängig vom Mainthread gerendert wird (wegen animierten Effekten und dem AniIndicator, "der ja augenscheinlich völlig autark lief"), was aber leider so doch nicht zutraf. |
AW: Controls sofort aktualisieren ohne ProcessMessages
Ich hab keine Ahnung von FMX, aber vielleicht genügt ein T(Win)Control.Update bzw. Refresh, Repaint etc? Sofern diese Methoden dort existieren.
MfG Dalai |
AW: Controls sofort aktualisieren ohne ProcessMessages
Die Antwort steht im Tutorial
![]() |
AW: Controls sofort aktualisieren ohne ProcessMessages
Ich kann jetzt gerade nicht probieren, ob es auch unter XE5 funktioniert, aber in XE8 tut es ein simples
Delphi-Quellcode:
um das Form komplett zu aktualisieren.
PaintTo(Canvas);
|
AW: Controls sofort aktualisieren ohne ProcessMessages
Unter XE5 funktioniert PaintTo (canvas) ebenfalls.
|
AW: Controls sofort aktualisieren ohne ProcessMessages
Auch wenn das funktioniert, friert die Anwendung trotzdem für 2,5 Sekunden ein.
Das ist nicht so im Sinne des UIThread-Erfinders, gelle? |
AW: Controls sofort aktualisieren ohne ProcessMessages
Das Stichwort heißt : TIdleWorker
Mavarik |
AW: Controls sofort aktualisieren ohne ProcessMessages
Zitat:
|
AW: Controls sofort aktualisieren ohne ProcessMessages
Zitat:
Leider ist es so, dass auf einem "schlappen" 1-CPU-1-Core-Device ein Thread die Performance des UIThread's so schmälert, dass z.B. die Timer-Animationen von Firemonkey nicht mehr "schön" laufen... Daher die Devise: UIAktion's Event entgegen nehmen (z.b. ein OnClick) dann kurz den IdleWorker initialisieren und so schnell wie möglich die komplette CPU Zeit an die UIThread abgeben... Wenn das OnIdle dann aufgerufen wird, kann "Deine" 2,5 Sekunden Aktion gerne in einem "richtigen" Thread gestartet werden... Aber erst dann... Wahrscheinlich wird man sowieso vorher ein "processing" an zeigen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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