![]() |
timer zu langsam?
hi,
Code:
wenn ich das in einem timer habe, der den intervall 1 hat, einfüge und die Form etwas grösser ist, kommt zwar alle 0,015 sek ein punkt dazu, trotzdem ist das auf die dauer echt lahmarschig. wie bekomm ich das schneller hin?
canvas.Pixels[Random(form1.Width), Random(Form1.Height)] := clRed;
|
Re: timer zu langsam?
Willst du so den ganzen Bildschirm füllen?
[edit=sakura] Doppelpost ausradiert :mrgreen: Mfg, sakura[/edit] |
Re: timer zu langsam?
jo, is nur zum testen, ich fange gerade erst mit canvas an, aber es muss doch auch schneller gehen oder?
EDIT: müsst ich mehrere timer nehmen? |
Re: timer zu langsam?
:hi:
Ich glaube Timer-Intervall auf 1 runter bringt nichts - ich hab schön des öfteren gelesen, dass da irgendwo mal schluss ist . . . mfg Tobias Edit : Philipp Frenzel aus den Delphi-Groups Die kleinste Timerauflösung sollte unter W9x so um 52ms liegen, bei NT kann man AFAIK bis gut 10ms runtergehen. |
Re: timer zu langsam?
jo, ich weiss, da ich aber nicht wusste wo "schluss" ist hab ich halt 1 genommen ;)
|
Re: timer zu langsam?
Zitat:
Ich dachte das Minimum von ca. 50ms wäre Hardware bedingt :gruebel: Tja, man lernt eben immer wieder... |
Re: timer zu langsam?
nimm doch einen eigenen Thread der ungefähr so aussieht:
Delphi-Quellcode:
Oder du lässt das sleep einfach ganz weg!
while true do
begin sleep(1); canvas.Pixels[Random(form1.Width), Random(Form1.Height)] := clRed; end; |
Re: timer zu langsam?
Kannst ja auch mal mehrer Pixel pro Timerinterval zeichnen, vielleicht hilft das ja was.
Delphi-Quellcode:
Statt Width und Height solltest du ClientWidth und ClientHeight verwenden, das gibt die richtige Größe des Canvas an. Bei Width und Height liegen einige gezeichnete Pixel außerhalb des Canvas und es dauert länger, bis alles ausgefüllt wird.
Procedure TForm1.Timer1Timer(Sender: TObject);
Var I: Integer; Begin For I := 1 to 20 do Canvas.Pixels[Random(ClientWidth), Random(ClientHeight)] := clRed; End; Wenn du es dann noch schafst, das keine Pixel doppelt gezeichnet werden, geht es noch mal viel schneller. Weitere Timer zu erstellen wird nichts helfen, bei so kurzen Intervallen dürften die sich gegenseitig ausbremsen. [add] Ein Thread wird wohl auch nicht viel bringen, die ganze Syncronisation dürfte den Vorteil eines Thread's total vernichten. |
Re: timer zu langsam?
Liste der Anhänge anzeigen (Anzahl: 1)
@himitsu
was willst du denn alles Syncronisieren??? :gruebel: Hab mal ein Beispiel angehangen um zu zeigen wie effektiv Threads sind. |
Re: timer zu langsam?
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich hab mir deinen Quellcode nicht erst angegukt.
Hab aber mal schnell dein Prog zum abstürzen gebracht - Dauer etwa 1-2 Sekunden. Hab das Programmfenster einfach mal schnell nach unten (teilweise aus dem Bildschirm raus) und gleich wieder nach oben verschoben. Und promt ist dein Thread mit dem Refresh des Formulars in konflickt getreten. Deshalb muß da eine Synchronisation rein !!! |
Re: timer zu langsam?
OK! Bei 200 Threads hatte ich auch ein Problem!
100 gingen noch! Aber mal im ernst: Man kanns auch übertreiben! :zwinker: Aber trozdem: Wie würde es denn mit syncronisieren aussehen??? (Also mein Quelltext) Arbeite zwar oft mit Threads, hab das Syncronisieren mir aber immer nur hingefuddelt! Was gibt es da für Möglichkeiten??? |
Re: timer zu langsam?
Selber hab ich mich bisher sehr erfolgreich um Threads herumgemogelt, hab also nur wenig Erfahrung mit Synchronisieren.
Das dürfte aber in etwa so aussehen:
Delphi-Quellcode:
Das geht natürlich nicht, der Hauptthread braucht ja auch ab und zu mal die Zugrifsrechte:
While True do Begin
Sleep(1); {Zugriff für andere Threads auf das Canvas sperren, auch für den Haupttread} Form1.Canvas.Lock; {auf Canvas zeichnen} Form1.Canvas.Pixels[Random(Form1.ClientWidth), Random(Form1.ClientHeight)] := clRed; {Zugriff wieder freigeben} Form1.Canvas.UnLock; End;
Delphi-Quellcode:
{Zugriff für andere Threads auf das Canvas sperren, auch für den Haupttread}
Form1.Canvas.Lock; While True do Begin Sleep(1); {auf Canvas zeichnen} Form1.Canvas.Pixels[Random(Form1.ClientWidth), Random(Form1.ClientHeight)] := clRed; End; {Zugriff wieder freigeben} Form1.Canvas.UnLock; |
Re: timer zu langsam?
Und was machen die anderen Threads in der Zeit wo das Canvas "gelockt" ist???
schlafen oder einfach das "gelockte" überspringen??? |
Re: timer zu langsam?
Normalerweise sollten die warten.
Da sollten wir aber mal sicherheitshalber einen Threadexperten fragen. |
Re: timer zu langsam?
Meldet euch ihr Threadexperten!!! ;)
|
Re: timer zu langsam?
hoi,
sleepymaster dein beispiel ist genau das was ich möchte! aber leider kommt immer ein fehler wenn ich minimiere/wiederherstelle oder doe form ausserhalb des bildschirmrandes schiebe. project...hat einen fehler veursacht :( |
Re: timer zu langsam?
@Nelsoni,
das ist genau das Problem, was ich meine. Wenn mehrere Threads gleichzeitig auf einen nicht threadsicheren Bereich zugreifen, dann kommt dieser Fehler. Hier greifen eben der Thead (Pixel zeichnen) und der Hauptthread (Fenster neuzeichnen) gleichzeitig schreibend auf das Canvas zu und stören sich gegenseitig. Das ist so, als wenn man zwei Fahrer an ein Lenkrad setzt und der eine nach links und der andere nach rechts will. |
Re: timer zu langsam?
Dann schreib den Thread halt so um:
Delphi-Quellcode:
procedure Thread;
begin try while run do begin x:=x+1; if Form1.SpinEdit2.Value<>0 then sleep(Form1.SpinEdit2.Value); Form1.Canvas.Lock; // von himitsu Form1.canvas.Pixels[Random(form1.Width), Random(Form1.Height)] := clRed; Form1.Canvas.UnLock; // von himitsu end; except end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 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