![]() |
GetTickCount zögert
:gruebel: . . . HI!
Mir ist gerade was komisches passiert. Wenn man auf einem Image.Canvas außerhalb des Canvas-Bereiches zeichnet, zögert die Aktualisierung von GetTickCount. Ist ziemlich schwer zu erklären, deswegen hier einfach der Code, dann könnt ihr's selber ausprobieren:
Delphi-Quellcode:
Auf der Form befinden sich also Image, TrackBar und Button.
procedure TForm1.Button1Click(Sender: TObject);
var Start, Y: Integer; begin Start := GetTickCount; Y := 0; repeat Image1.Canvas.Ellipse(0, Y, 50, Y+50); Y := Y - 10; TrackBar1.Position := GetTickCount-Start; Application.ProcessMessages; until TrackBar1.Position = TrackBar1.Max; end; Dieses Problem tritt nicht auf, wenn man statt eines Images eine PaintBox benutzt. Wenn man die Zeile
Delphi-Quellcode:
weglässt, läuft der TrackBar auch glatt.
Application.ProcessMessages;
Kennt jemand das Problem? Warum ist das so? EDIT: TrackBar.Min ist 0, Max ca. 3000. Y könnt ihr am Anfang auch auf nen höheren Wert setzen (500), und statt um 10 könnt ihr es auch um 1 oder so erniedrigen. |
Re: GetTickCount zögert
GetTickCount aktualisiert sich meines Wissens in einem eigenen Thread. Daher kann das nicht sein.
Das Problem ist vermutlich das, dass Application.ProcessMessages zu lange braucht und daher die Schleife lange bis zum nächsten Schritt braucht. Das dürfte aber normalerweise auch nicht sein. |
Re: GetTickCount zögert
Zitat:
|
Re: GetTickCount zögert
Was für einen PC hast du? Eine Z3? :lol:
Wenn ich auf den Button klicke, ist die Trackbar so gut wie sofort am anderen Ende und ich sehe 4 Ellipsen auf dem Image. Egal ob mit oder ohne Application.ProcessMessages. |
Re: GetTickCount zögert
Zitat:
Zitat:
|
Re: GetTickCount zögert
Ich bemerke auch bei 3s nichts Außergewöhnliches :stupid: .
|
Re: GetTickCount zögert
Liste der Anhänge anzeigen (Anzahl: 1)
Hä? Moment, ich lad die Exe einfach mal hoch, dann geh ich sicher, dass ihr auch wirklich das gleiche Programm habt wie ich.
Guckt nur auf den TrackBar. Wenn er dann immer noch ganz glatt und gleichmäßig läuft, hab ich wohl wirklich nen scheiß Computer :wall: |
Re: GetTickCount zögert
Läuft richtig schön smooth durch.
BTW: Dass du eine Z3 hast, erkennst du an dem charakteristischen Klackern und dem Gewicht von etwa einer metrischen Tonne. |
Re: GetTickCount zögert
Hi
Also bei mir läuft das absolut nicht schön durch. Zuerst geht's wenige Pixel sehr schnell, dann etwas langsamer und anschließend macht die Trackbar 2 riesige Sprünge bis zum Ende. (Athlon XP 2800+, 1 GB RAM). Aber woran das liegen kann, weiß ich auch nicht. :gruebel: |
Re: GetTickCount zögert
Also bei mir läuft die TrackBar gleichmässig durch, braucht ca. 4 Sek. dazu. Der weisse Flecke ist in < 0.5sek. durch und hinterlässt den schwarzen Balken.
Warum es bei manchen nicht gleichmässig läuft, ist mMn das die ProcessMessages gar nicht richtig läuft, feststellen kann man dies, indem man während die TrackBar läuft, es nicht möglich ist das Programm zu beeenden, man kann die Bar dadurch leicht bremsen, die Ereignisreihenfolge/Abarbeitung ist da nicht ganz "zuverlässig". |
Re: GetTickCount zögert
Zitat:
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Start, Y: Integer; begin Start := GetTickCount; Y := 200; repeat Image1.Canvas.Ellipse(0, Y, 50, Y+50); Y := Y - 1; TrackBar1.Position := GetTickCount-Start; Application.ProcessMessages; until TrackBar1.Position = TrackBar1.Max; end; |
Re: GetTickCount zögert
Nicht dass ich wüsste - du könntest höchstens die entsprechenden Controls einzeln refreshen.
Noch sauberer geht das ganze natürlich mit Threads - dazu siehe das Tutorial von... ich glaube es war Luckie... |
Re: GetTickCount zögert
Hast du bestimmte einstellungen fürs Image und TrackBar? Wenn ich das alles bei mir laufen lasse, ist es in ein paar ms fertig.
|
Re: GetTickCount zögert
Zitat:
Zum Quelltext selbst: Ich finde es etwas ungeeignet abhängig von der Anzahl der Schleifendurchläufe eine bestimmte Anzahl an Elypsen zu zeischnen. In 10 Jahre ist das ganze eventuell so schnell (je nach Rechner) das ein überlauf entsteht. Zudem dürfte die CPU-Auslastung auf 100% stehen während der Ausführung. Ich fände es sinnvoller wenn Y anahand der verstrischenen Zeit berechnet wird. Zudem macht es keinen Sinn durchweg die Schleife mit voller Last laufen zu lassen. Ich würde da noch ein kurzes Sleep(20) einbauen damit die CPU nicht unnötig auf 100% Leistung hoch geschraubt wird. Zudem könnte mann dann davon ausgehen das unbabhängig von der Geschwindigkeit der CPU die Schleife ungefähr gleich oft durchlaufen wird auf jedem Rechner. Für die Fortschrittsanzeige ist übrigens auch eine Progessbar besser geeignet als eine Trackbar. Die Trackbar ist eigentlich dafür gedacht das der User den Wert ändern kann was bei deinem beispiel ja aber nicht geht weil du in der Schleife den wert immer korrigierst und im OnChange der Trackbar ja nicht reagierst sondern dort wo du den Wert automatisch setzt. |
Re: GetTickCount zögert
Zitat:
Zitat:
Zitat:
Zitat:
Ich werde das fertige Programm dann bei Gelegenheit wahrscheinlich auch mal hier vorstellen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz