AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Controls sofort aktualisieren ohne ProcessMessages

Controls sofort aktualisieren ohne ProcessMessages

Ein Thema von Photoner · begonnen am 6. Jul 2015 · letzter Beitrag vom 7. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2   
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 17:04
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  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.
Chris
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 17:35
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#3

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 17:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 17:57
Die Antwort steht im Tutorial http://www.delphipraxis.net/185749-f...-callback.html
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.470 Beiträge
 
Delphi 12 Athens
 
#5

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 17:59
Ich kann jetzt gerade nicht probieren, ob es auch unter XE5 funktioniert, aber in XE8 tut es ein simples PaintTo(Canvas); um das Form komplett zu aktualisieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 18:36
Unter XE5 funktioniert PaintTo (canvas) ebenfalls.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 18:56
Auch wenn das funktioniert, friert die Anwendung trotzdem für 2,5 Sekunden ein.

Das ist nicht so im Sinne des UIThread-Erfinders, gelle?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 20:06
Das Stichwort heißt : TIdleWorker

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 6. Jul 2015, 20:09
Das Stichwort heißt : TIdleWorker

Mavarik
Nein, eine Aktion, die 2,5 Sekunden dauert gehört in einen Thread und nicht in den UIThread
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Controls sofort aktualisieren ohne ProcessMessages

  Alt 7. Jul 2015, 01:58
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...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 Uhr.
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