본문 바로가기

카테고리 없음

[시스템] Sleep 중에도 타이머 이벤트 발생시키기

반응형
// 보통 Sleep() 함수를 사용하면 TTimer 의 동작도 멈추게 되는데
// MMTimer 를 사용하면 이벤트를 발생시킬 수 있습니다
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, mmsystem, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MMTimer1 : integer;
  end;

var
  Form1: TForm1;
  Cnt1, Cnt2 : integer;

implementation

{$R *.dfm}

procedure MyTimerCallBackProg(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
Inc(Cnt1);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(Cnt2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // timeSetEvent()의 첫번쨰 파라미터가 시간입니다
  MMTimer1 := timeSetEvent(1,1,@MyTimerCallBackProg,100,TIME_PERIODIC);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  timeKillEvent(MMTimer1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  t : integer;
begin
  Memo1.Lines.Clear;
  Cnt1 := 0;
  Cnt2 := 0;
  Timer1.Enabled  := False;
  Timer1.Interval := 1;
  Timer1.Enabled  := True;
  Sleep(5000); // 5초간 sleep
  Memo1.Lines.Add('MMTimer 가 발생시킨 횟수: '+IntToStr(Cnt1));
  Memo1.Lines.Add('TTimer 가 발생시킨 횟수: '+IntToStr(Cnt2));
end;

end.
반응형