乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      sleep;TTtimer控件,Sleep函數(shù),GetTickCount函數(shù);sleep函...

       獨孤求財 2012-03-20

      sleep;TTtimer控件,Sleep函數(shù),GetTickCount函數(shù);sleep函數(shù)的用法,sleep函數(shù)的用法;Delphi廷時函數(shù)

      時間:2011-5-26來源:yang 作者: peng點擊: 164次

      Delphi中三種延時方法及其定時精度分析(轉(zhuǎn)載)

       在Delphi中,通??梢杂靡韵氯N方法來實現(xiàn)程序的延時,即TTtimer控件,Sleep函數(shù),GetTickCount函數(shù)。但是其精度是各不相同的。
      一、三種方法的簡單介紹

      1)TTtimer控件

        TTtimer控件的實質(zhì)是調(diào)用Windows API定時函數(shù)SetTimer和KillTimer來實現(xiàn)的,并簡化了對WM_TIMER 消息的處理過程。通過設(shè)置OnTimer事件和Interval屬性,我們可以很方便的產(chǎn)生一些簡單的定時事件。

      2)Sleep函數(shù)

        Sleep函數(shù)用來使程序的執(zhí)行延時給定的時間值。Sleep的調(diào)用形式為Sleep(milliseconds),暫停當(dāng)前的進程milliseconds毫秒。Sleep的實現(xiàn)方法其實也是調(diào)用Windows API的Sleep函數(shù)。例如:

      sleep(1000); //延遲1000毫秒

      Sleep會引起程序停滯,如果你延遲的時間較長的話,你的程序?qū)⒉荒軌蝽憫?yīng)延時期間的發(fā)生的其他消息,所以程序看起來好像暫時死機。

      3)GetTickCount函數(shù)

        在主程序中延時,為了達到延時和響應(yīng)消息這兩個目的,GetTickCount()構(gòu)成的循環(huán)就是一種廣為流傳的方法。例如:

      procedure Delay(MSecs: Longint);
      //延時函數(shù),MSecs單位為毫秒(千分之1秒)
      var
      FirstTickCount, Now: Longint;
      begin
      FirstTickCount := GetTickCount();
      repeat
      Application.ProcessMessages;
      Now := GetTickCount();
      until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
      end;

      二、高精度的微妙級性能計數(shù)器(high-resolution performance counter)介紹

        為了比較以上方法的精度,首先需要找到一個參考的定時器。在這里,我提供了兩個參考的定時器。一是用單片機每隔1.024ms產(chǎn)生一個實時中斷RTI,作為計數(shù)器;二是選用了一個高精度的微妙級性能計數(shù)器(參見: http://msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/default.aspx ,或者 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200249


      1)計數(shù)器的Delphi源代碼

      {
      A high-precision counter/timer. Retrieves time differences
      downto microsec.
      Quick Reference:
      THPCounter inherits from TComponent.

      Key-Methods:
      Start: Starts the counter. Place this call just before the
      code you want to measure.

      Read: Reads the counter as a string. Place this call just
      after the code you want to measure.

      ReadInt: Reads the counter as an Int64. Place this call just
      after the code you want to measure.
      --------------------------------------------------------------------------------
      }
      unit HPCounter;

      interface

      uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, ExtCtrls;

      type
      TInt64 = TLargeInteger;
      THPCounter = class(TComponent)
      private
      Frequency: TLargeInteger;
      lpPerformanceCount1: TLargeInteger;
      lpPerformanceCount2: TLargeInteger;
      fAbout: string;
      procedure SetAbout(Value: string);
      { Private declarations }
      public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure Start;
      function Read: string;
      function ReadInt: TLargeInteger;
      { Private declarations }
      published
      property About: string read fAbout write SetAbout;
      { Published declarations }
      end;


      procedure Register;

      implementation

      procedure Register;
      begin
      RegisterComponents(‘MAs Prod.‘, [THPCounter]);
      end;

      constructor THPCounter.Create(AOwner: TComponent);
      begin
      inherited Create(AOwner);
      fAbout:= ‘Version 1.1, 2000&reg; Mats Asplund, EMail: masprod@telia.com, Site: http:///masdp
      end;

      destructor THPCounter.Destroy;
      begin
      inherited Destroy;
      end;

      function THPCounter.Read: string;
      begin
      QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));
      QueryPerformanceFrequency(TInt64((@Frequency)^));
      Result:=IntToStr(Round(1000000 * (lpPerformanceCount2 -
      lpPerformanceCount1) / Frequency));
      end;

      function THPCounter.ReadInt: TLargeInteger;
      begin
      QueryPerformanceCounter(TInt64((@lpPerformanceCount2)^));
      QueryPerformanceFrequency(TInt64((@Frequency)^));
      Result:=Round(1000000 * (lpPerformanceCount2 -
      lpPerformanceCount1) / Frequency);
      end;

      procedure THPCounter.SetAbout(Value: string);
      begin
      Exit;
      end;

      procedure THPCounter.Start;
      begin
      QueryPerformanceCounter(TInt64((@lpPerformanceCount1)^));
      end;

      end.

      2)使用方法:
      unit Unit1;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      HPCounter, StdCtrls;

      type
      TForm1 = class(TForm)
      Button1: TButton;
      Edit1: TEdit;
      Label1: TLabel;
      Label2: TLabel;
      procedure Button1Click(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
      end;

      var
      Form1: TForm1;

      implementation

      {$R *.DFM}

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      Edit1.Text:= ‘‘;
      Application.ProcessMessages;
      with THPCounter.Create(Self) do
      begin
      Start;
      // Place code to measure here
      Sleep(1000);
      // Place code to measure here
      Edit1.Text:=Read;
      Free;
      end;
      end;

      end.

      二、三種方法的精度比較

        為了比較,采用以上3種方法,分別設(shè)置延時時間為1ms、2ms、5ms、10ms、20ms、50ms、100ms、200ms、500ms、1000ms,循環(huán)次數(shù)為5次,得到實際的延時時間。

      1)TTtimer控件

      實際延時時間(ms)
      1ms: 8.012 21.551 6.875 21.647 9.809
      2ms: 9.957 20.675 14.671 11.903 20.551
      5ms: 9.952 20.605 9.924 20.705 12.682
      10ms:14.852 9.96 21.547 9.82 20.634
      20ms:27.512 34.291 26.427 31.244 30.398
      50ms:61.196 61.307 64.027 62.048 63.059
      100ms:102.495 108.408 112.318 110.322 102.531
      200ms:193.955 202.135 207.016 205.082 202.194
      500ms:496.659 500.534 503.398 495.551 500.394
      1000ms:999.699 1003.576 993.698 1004.443 995.625

      2)Sleep函數(shù)

      1ms: 1.895 1.895 1.896 1.897 1.898
      2ms: 2.868 2.874 2.852 2.872 2.869
      5ms: 5.8 5.797 5.79 5.79 5.791
      10ms:10.675 10.683 10.611 10.669 10.67
      20ms:20.404 20.434 20.447 20.477 20.368
      50ms:50.67 50.691 50.69 50.682 50.671
      100ms:100.515 100.469 100.484 100.481 100.484
      200ms:200.101 200.126 199.892 200.066 200.108
      500ms:499.961 499.961 499.958 499.961 499.96
      1000ms:1000.034 1000.04 1000.03 1000.018 1000.029

      3)GetTickCount函數(shù)

      1ms: 15.54 15.596 15.527 15.566 15.838
      2ms: 15.561 15.563 15.603 15.477 15.571
      5ms: 15.519 15.549 15.569 15.666 15.394
      10ms:15.558 15.561 15.522 15.568 15.518
      20ms:31.186 31.137 31.17 31.17 31.19
      50ms:62.445 62.4 63.893 60.88 62.404
      100ms:109.276 109.298 109.273 109.28 109.28
      200ms:203.027 203.084 203.021 203.027 203.046
      500ms:499.959 499.961 499.963 499.967 499.965
      1000ms:1000.023 1000.022 1000.026 1000.029 1000.021


        可見,相對而言,Sleep的精度最高,尤其是在10ms以內(nèi)的延時,只有sleep函數(shù)才能夠做到。TTimer控件的定時精度最差,而且穩(wěn)定性不好,波動很大。GetTickCount函數(shù)所能實現(xiàn)的最短延時為15ms左右,穩(wěn)定性相對TTimer要好一些。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多