Autor |
Beitrag |
peeage
      
Beiträge: 50
|
Verfasst: Di 27.07.10 20:05
Hallo zusammen,
in meiner Applikation gibt es einen Popup, welcher durch eine repeat/until- Schleife gesteuert wird. Aller 50ms schiebt sich das Popupfensfer um einen Pixel nach oben. Parallel wird der AlphaBlendValue der Form um eins erhöht, damit ein Einblend- Effekt entsteht. Anfangs wurde die Erhöhung des AlphaBlendValue innerhalb der Schleife nicht umgesetzt. Ich musste dazu noch Application.ProcessMessages aufrufen, dann hat es funktioniert.
Nun habe ich das Problem das der Popup ab und zu langsam oder auch ruckelnd hochkommt. Ich vermute das liegt an dem Application.ProcessMessages. Gibt es hier evntl. eine elegantere Lösung?
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 27.07.10 20:33
Das hört sich so an als sei dir nicht klar was Application.ProcessMessages macht... Hast du einmal in der Hilfe geschaut?
Solange dein Codeblock ausgeführt wird, kann kein anderer Code im selben Thread ausgeführt werden. Da die Botschaftswarteschleife ebenfalls im Hauptthread läuft, können die Nachrichten, die ankommen, also nicht verarbeitet werden.
Mir ProcessMessages sagst du jetzt, dass alle Nachrichten aus der Warteschleife abgearbeitet werden soll. Das sind unter anderem die Zeichenbefehle, so dass dein Fenster neu gezeichnet werden kann und so weiter.
Du kannst stattdessen einmal Refresh z.B. versuchen. Abgesehen davon halte ich wenig davon solche Einblendeffekte immer einen Pixel weiter zu schieben oder so. Viel sinnvoller ist es, wenn du abhängig von der vergangenen Zeit die aktuelle Position und Transparenz berechnest. Dann dauert der Effekt nämlich immer gleich lang und ruckelt nur, wenn der Rechner gerade ausgelastet ist.
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 27.07.10 20:58
jaenicke hat folgendes geschrieben : | Viel sinnvoller ist es, wenn du abhängig von der vergangenen Zeit die aktuelle Position und Transparenz berechnest. Dann dauert der Effekt nämlich immer gleich lang und ruckelt nur, wenn der Rechner gerade ausgelastet ist. |
Wie würde das denn als Code aussehen, wenn ein Kreis auf einer Paintbox bewegt werden soll?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
peeage 
      
Beiträge: 50
|
Verfasst: Di 27.07.10 20:59
Danke für die schnelle Antwort.Werde es morgen mit "refresh" probieren.
wie meinst du das genau mit der Berechnung? Ich arbeite mit sleep(50).somit sollte der Effekt doch so gut wie immer gleich schnell sein, oder?
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.07.10 06:30
peeage hat folgendes geschrieben : | wie meinst du das genau mit der Berechnung? Ich arbeite mit sleep(50).somit sollte der Effekt doch so gut wie immer gleich schnell sein, oder? |
Nein. Sleep legt den aktuellen Thread schlafen. Wann der dann genau wieder aufgeweckt wird, hängt nicht nur von der angegebenen Zeit ab. Wenn Windows stark ausgelastet ist, hat es schlicht keine Ressourcen, dann verzögert sich das ggf. und dann hängt deine Darstellung eben.
Du kannst auch dieses Delay benutzen, dann brauchst du kein Sleep:
www.delphipraxis.net...delay+revisited.html
|
|
peeage 
      
Beiträge: 50
|
Verfasst: Mi 28.07.10 13:48
Also wenn ich nun refresh order repaint benutze, dann flackert der Popup :-/ ... Gibt es nicht noch eine andere Lösung???
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 28.07.10 14:40
doublebuffered := true; und nicht pixelweise verschieben sondern 5 pixel auf einmal. damit hat es bei mir dann meistens geklappt.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
|