Delphi-PRAXiS
Seite 2 von 2     12   

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

Codehunter 24. Feb 2017 08:55

AW: Timer Reset ?
 
Zitat:

Zitat von hoika (Beitrag 1362497)
Eine Timer-Nachricht hat zusammen mit WM_PAINT eine geringere Priorität als andere Nachrichten.

Exakt solltest du nicht im wörtlichen Sinne auffassen. Aber gerade wenn Timer-Nachrichten eine geringere Priorität hätte, müsste die Zeitspanne doch eher größer werden als kleiner. Hier habe ich aber den Effekt, dass es teils deutlich unter einer Sekunde ist.

Rollo62 24. Feb 2017 10:37

AW: Timer Reset ?
 
Zitat:

Ein Windows-Standard-Timer ist sehr ungenau.
Naja, aber 0 ... 1000ms sollte es nicht sein.
Ich würde mal sagen +/- 50ms könnten drin sein.

Aber du machst ja gar keine echte Messung, nur das Caption hochzählen.
Könnte auch sein dass das Neuzeichen des Captions so lange braucht.

- Das würde ich dan mit QueryPerformanceCounter oder TStopWatch mal genau nachmessen
- und Caption mit Repaint edtwas forcieren

Rollo

Codehunter 24. Feb 2017 12:25

AW: Timer Reset ?
 
Zitat:

Zitat von Rollo62 (Beitrag 1362507)
Zitat:

Ein Windows-Standard-Timer ist sehr ungenau.
Naja, aber 0 ... 1000ms sollte es nicht sein.
Ich würde mal sagen +/- 50ms könnten drin sein.

Aber du machst ja gar keine echte Messung, nur das Caption hochzählen.
Könnte auch sein dass das Neuzeichen des Captions so lange braucht.

Wie gesagt, es ist ein seeeehr einfaches Testprogramm. Ich habe lediglich eine ungefähre Testmethode gebraucht. Aber auch du liegst falsch: Der Timer kommt in zu kurzen Intervallen, insofern ist die Repaint-Zeit vom Caption irrelevant ^^

Erfahrungsgemäß läuft gerade das NCPaint aber sehr flott ab, wesentlich höher priorisiert als Paints in der ClientArea. Deswegen verwende ich das gerne für Quick-and-Dirty-Tests. Ich konnte das Timer-Intervall auch auf 10 Sekunden stellen und es kommt teilweise < 1 Sekunde.

Rollo62 24. Feb 2017 13:26

AW: Timer Reset ?
 
Mal blöde Frage, benutzt du VmWare oder VirtualBox, oder *würg* Parallels ?

Rollo

Codehunter 24. Feb 2017 14:29

AW: Timer Reset ?
 
Zitat:

Zitat von Rollo62 (Beitrag 1362544)
Mal blöde Frage, benutzt du VmWare oder VirtualBox, oder *würg* Parallels ?

VirtualBox. Aber bevor du dich jetzt zu sehr auf die Virtualisierung versteifst: Das Problem trat zuerst nicht-virtualisiert auf der Hostmaschine auf.

Rollo62 24. Feb 2017 14:36

AW: Timer Reset ?
 
Also solche Timer hatte ich zum Glück noch nicht.
Hat der Rechner denn sonst irgendwelche Macken ?

Also wenn vielleicht irgendwelche Tasks im Hintergrund extrem was verabeiten,
aber im Leerlauf sollte das nicht so extrem passieren.

Rollo

t.roller 24. Feb 2017 16:20

AW: Timer Reset ?
 
Man kann sich auch selbst einen Timer machen mit
WaitableTimer

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var
AlarmTimer : THandle;
Zeit : Large_Integer;
start, ende : Cardinal;
begin
  Memo1.lines.add('SetWaitableTimer: 1 sec Running');
  start:= GetTickCount;
AlarmTimer := CreateWaitableTimer(nil, False, nil);
CancelWaitableTimer(AlarmTimer);  // goto Start
Zeit.QuadPart := 1 * (-10000000); // 1 Sekunde
SetWaitableTimer(AlarmTimer, Zeit.Quadpart, 0, nil, nil, False);
while WaitForSingleObject(AlarmTimer, 20) <> Wait_Object_0 do // Beispiel: 20msec
begin Application.ProcessMessages; end;
  end1:= GetTickCount;
  Memo1.lines.add(INTTOSTR(end1-start)+' msec');
  Memo1.lines.add('WaitableTimer: Ready');
end;
AUSGABE:
SetWaitableTimer: 1 sec Running
1000 msec
WaitableTimer: Ready

Alternative: 10 sec
Delphi-Quellcode:
var
  Form1: TForm1;
  start, end1 : Cardinal;

procedure TimerAPCProc (param: Pointer; dwTimerLowValue, dwTimerHighValue: CARDINAL); stdcall;
begin
  end1:= GetTickCount;
  Form1.Memo1.lines.add(INTTOSTR(end1-start)+' msec');
  Form1.Memo1.lines.add('WaitableTimer: Ready');
end;

procedure TForm1.Button9Click(Sender: TObject);
var
  HTimer: THandle;
  DueTime: Int64;
begin
  Memo1.lines.add('SetWaitableTimer: 10 sec Running');
  start:= GetTickCount;
  HTimer:= CreateWaitableTimer (nil, False, nil);
  if HTimer <> 0 then
    begin
      DueTime:= 10*(-10000000);//10 sec
      if SetWaitableTimer (HTimer, DueTime, 0,//once
                           @TimerAPCProc,
                           Pointer (HTimer), False) then
        BEGIN SleepEx (INFINITE, True); END;
      CloseHandle (HTimer);
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 Uhr.
Seite 2 von 2     12   

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