Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 0,833 ms Delay in Delphi? (https://www.delphipraxis.net/169-0-833-ms-delay-delphi.html)

thomasdrewermann 16. Jun 2002 11:27


0,833 ms Delay in Delphi?
 
Wie kann ich in Delphi ein Delay von 0,833 ms realisieren?

Daniel B 16. Jun 2002 11:42

Hi,

Luckie hat doch mal was mit Delay in den Faq's geschrieben. Villeicht kannst du msec satt LongInt, als Real deklarieren und somit auch ,zahlen eingeben. Villeicht gehts ja.

Grüsse, Daniel :)

Christian Seehase 16. Jun 2002 11:55

Moin Thomas,

schau Dir doch auch mal die Funktionen QueryPerformanceCounter, QueryPerformanceFrequency an.
Dann blieben noch die Multimedia Timer.

Mit GetTickCount usw. wirst Du da wohl leider nichts werden, da dessen Auflösung bestenfalls 1ms beträgt, und die Rückgabe der Werte erfolgt auch nicht gerade mit der höchsten Präzision.

thomasdrewermann 16. Jun 2002 13:45

Kannst du mir n CODE-BEISPIEL basteln?? :D

Christian Seehase 16. Jun 2002 14:10

Moin Thomas,

ich hab's mal versucht

Code:
var
  iFreq       : int64;
  iCountStart : int64;
  iCountEnd   : int64;
  iDelta      : int64;
  iCountPerSec : int64;
  iCount833    : int64;

begin
  // INITIALISIERUNG
  QueryPerformanceFrequency(iFreq);
  QueryPerformanceCounter(iCountStart);
  QueryPerformanceCounter(iCountEnd);
  // Aufwand für den Aufruf ermitteln, um die Präzision zu erhöhen
  iDelta := iCountEnd-iCountStart;
  QueryPerformanceCounter(iCountStart);
  while true do
  begin
    QueryPerformanceCounter(iCountEnd);
    if ((iCountEnd-iCountStart-iDelta)/iFreq) >= 1 then
    begin
      iCountPerSec := (iCountEnd-iCountStart-iDelta);
      break;
    end;
  end;
  iCount833 := Round((iCountPerSec / 1000000) * 833);
  // INITIALISIERUNG ENDE
  // iCount833 enthält jetzt, so ca., die Anzahl der "Ticks" des
  // PerformanceCounters für 0,833 ms
  // iCount833, und iDelta müssen global zugänglich sein, und, sinnvoller Weise,
  // beim Programmstart initialisiert werden.
  // Wichtig: Der Wert ist Rechnerabhängig, kann also nicht einmal
  // Berechnet und als Konstante angegeben werden.

  // 0,833 ms warten
  QueryPerformanceCounter(iCountStart);
  while true do
  begin
    QueryPerformanceCounter(iCountEnd);
    if (iCountEnd-iCountStart-iDelta) >= iCount833 then
    begin
      break;
    end;
  end;
Ob's so wirklich einwandfrei funzt weiss ich leider nicht, aber ich denke mal, dass Du da eine Testmöglichkeit hast, wenn Du es schon so genau wissen willst ;-)
Einziges Problem: Der PerformanceCounter steht nicht auf jedem Rechner zur Verfügung. :-(

thomasdrewermann 16. Jun 2002 18:46

Ich werds nächste Woche mal probieren, morgen schreib ich erstmal eine Lateinklausur (hoffentlich 4)....


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz