Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Controls sofort aktualisieren ohne ProcessMessages (https://www.delphipraxis.net/185787-controls-sofort-aktualisieren-ohne-processmessages.html)

Photoner 6. Jul 2015 16:04

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:
 Application.ProcessMessages
hinbekommen. Geht das auch ohne?

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.

stahli 6. Jul 2015 16:35

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: http://www.delphipraxis.net/175033-f...-schlecht.html
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.

Dalai 6. Jul 2015 16:39

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

Sir Rufo 6. Jul 2015 16:57

AW: Controls sofort aktualisieren ohne ProcessMessages
 
Die Antwort steht im Tutorial http://www.delphipraxis.net/185749-f...-callback.html

Uwe Raabe 6. Jul 2015 16:59

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:
PaintTo(Canvas);
um das Form komplett zu aktualisieren.

Harry Stahl 6. Jul 2015 17:36

AW: Controls sofort aktualisieren ohne ProcessMessages
 
Unter XE5 funktioniert PaintTo (canvas) ebenfalls.

Sir Rufo 6. Jul 2015 17:56

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?

Mavarik 6. Jul 2015 19:06

AW: Controls sofort aktualisieren ohne ProcessMessages
 
Das Stichwort heißt : TIdleWorker

Mavarik

Sir Rufo 6. Jul 2015 19:09

AW: Controls sofort aktualisieren ohne ProcessMessages
 
Zitat:

Zitat von Mavarik (Beitrag 1307874)
Das Stichwort heißt : TIdleWorker

Mavarik

Nein, eine Aktion, die 2,5 Sekunden dauert gehört in einen Thread und nicht in den UIThread

Mavarik 7. Jul 2015 00:58

AW: Controls sofort aktualisieren ohne ProcessMessages
 
Zitat:

Zitat von Sir Rufo (Beitrag 1307877)
Nein, eine Aktion, die 2,5 Sekunden dauert gehört in einen Thread und nicht in den UIThread

Ja und nein...

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 11:22 Uhr.
Seite 1 von 2  1 2      

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