Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi timer zu langsam? (https://www.delphipraxis.net/13895-timer-zu-langsam.html)

Pseudemys Nelsoni 28. Dez 2003 18:19


timer zu langsam?
 
hi,

Code:
canvas.Pixels[Random(form1.Width), Random(Form1.Height)] := clRed;
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?

Dagon 28. Dez 2003 18:21

Re: timer zu langsam?
 
Willst du so den ganzen Bildschirm füllen?

[edit=sakura] Doppelpost ausradiert :mrgreen: Mfg, sakura[/edit]

Pseudemys Nelsoni 28. Dez 2003 18:23

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?

Mirilin 28. Dez 2003 18:30

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.

Pseudemys Nelsoni 28. Dez 2003 18:41

Re: timer zu langsam?
 
jo, ich weiss, da ich aber nicht wusste wo "schluss" ist hab ich halt 1 genommen ;)

MrKnogge 28. Dez 2003 19:46

Re: timer zu langsam?
 
Zitat:

Zitat von Mirilin

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.

Sicher ?
Ich dachte das Minimum von ca. 50ms wäre Hardware bedingt :gruebel:
Tja, man lernt eben immer wieder...

SleepyMaster 28. Dez 2003 19:58

Re: timer zu langsam?
 
nimm doch einen eigenen Thread der ungefähr so aussieht:

Delphi-Quellcode:
while true do
  begin
  sleep(1);
  canvas.Pixels[Random(form1.Width), Random(Form1.Height)] := clRed;
  end;
Oder du lässt das sleep einfach ganz weg!

himitsu 28. Dez 2003 20:28

Re: timer zu langsam?
 
Kannst ja auch mal mehrer Pixel pro Timerinterval zeichnen, vielleicht hilft das ja was.

Delphi-Quellcode:
Procedure TForm1.Timer1Timer(Sender: TObject);
  Var I: Integer;

  Begin
    For I := 1 to 20 do
      Canvas.Pixels[Random(ClientWidth), Random(ClientHeight)] := clRed;
  End;
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.
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.

SleepyMaster 28. Dez 2003 21:15

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.

himitsu 28. Dez 2003 21:25

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 !!!

SleepyMaster 28. Dez 2003 21:32

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???

himitsu 28. Dez 2003 21:50

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:
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;
Das geht natürlich nicht, der Hauptthread braucht ja auch ab und zu mal die Zugrifsrechte:
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;

SleepyMaster 28. Dez 2003 22:06

Re: timer zu langsam?
 
Und was machen die anderen Threads in der Zeit wo das Canvas "gelockt" ist???
schlafen oder einfach das "gelockte" überspringen???

himitsu 28. Dez 2003 22:21

Re: timer zu langsam?
 
Normalerweise sollten die warten.

Da sollten wir aber mal sicherheitshalber einen Threadexperten fragen.

SleepyMaster 28. Dez 2003 22:22

Re: timer zu langsam?
 
Meldet euch ihr Threadexperten!!! ;)

Pseudemys Nelsoni 28. Dez 2003 22:51

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 :(

himitsu 29. Dez 2003 08:59

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.

SleepyMaster 29. Dez 2003 11:02

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