免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Delphi多線程編程 - 編程技巧文章 - 藍鳥軟件-17

 justlook 2010-09-18

多線程編程(16) - 多線程同步之 WaitableTimer (等待定時器對象)[續(xù)二]

代碼文件:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
var
 hTimer: THandle;
{APC 函數(shù)(過程), 函數(shù)名和參數(shù)名可以不同, 格式必須如此}
procedure TimerAPCProc(lpArgToCompletionRoutine: Pointer; dwTimerLowValue: DWORD;
 dwTimerHighValue: DWORD); stdcall;
begin
 Form1.Text := IntToStr(StrToIntDef(Form1.Text, 0) + 1); {標題 + 1}
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 DueTime: Int64;
begin
 hTimer := CreateWaitableTimer(nil, True, nil);
 DueTime := 0;
 if SetWaitableTimer(hTimer, DueTime, 0, @TimerAPCProc, nil, False) then
 begin
  SleepEx(INFINITE, True); {INFINITE 表示一直等}
 end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 CloseHandle(hTimer);
end;
end.

窗體文件:

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 113
 ClientWidth = 203
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
  Left = 64
  Top = 48
  Width = 75
  Height = 25
  Caption = 'Button1'
  TabOrder = 0
  OnClick = Button1Click
 end
end

  在上面例子中, 每點一次鼠標, 那個回調函數(shù)才執(zhí)行一次; 作為定時器, 如果想讓它每秒執(zhí)行一次怎么弄?

  但每一次執(zhí)行那個 APC 函數(shù), 都得有 SleepEx(當然不止它)給送進去, 那這樣得反復調用 SleepEx 才可以.

  怎么調用, 用循環(huán)嗎? 別說網(wǎng)上能找到的例子我沒見到不用循環(huán)的(太笨了), 就在那個 APC 函數(shù)里調用不就完了.

  當然這時一般要設時間間隔的, 下面我們將設間隔為 1000(1秒).

  但接著問題又來了, 譬如把代碼修改成:

var
 hTimer: THandle;
procedure TimerAPCProc(lpArgToCompletionRoutine: Pointer; dwTimerLowValue: DWORD;
 dwTimerHighValue: DWORD); stdcall;
begin
 Form1.Text := IntToStr(StrToIntDef(Form1.Text, 0) + 1);
 SleepEx(INFINITE, True); {這里再次調用 SleepEx}
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 DueTime: Int64;
begin
 hTimer := CreateWaitableTimer(nil, True, nil);
 DueTime := 0;
 {下面的參數(shù) 1000 表示間隔 1秒}
 if SetWaitableTimer(hTimer, DueTime, 1000, @TimerAPCProc, nil, False) then
 begin
  SleepEx(INFINITE, True);
 end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 CloseHandle(hTimer);
end;

任務能完成, 但窗體"死"了... 怎么辦? 嘿, 現(xiàn)在學的不是多線程嗎?

  下面例子中, 同時使用了 CancelWaitableTimer 來取消定時器, 很好理解; 效果圖:

多線程編程(16) - 多線程同步之 WaitableTimer (等待定時器對象)[續(xù)二]

  代碼文件:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  Button2: TButton;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
var
 hTimer: THandle;
{APC 函數(shù)}
procedure TimerAPCProc(lpArgToCompletionRoutine: Pointer; dwTimerLowValue: DWORD;
 dwTimerHighValue: DWORD); stdcall;
begin
 Form1.Text := IntToStr(StrToIntDef(Form1.Text, 0) + 1);
 SleepEx(INFINITE, True);
end;
{線程入口函數(shù)}
function MyThreadFun(p: Pointer): Integer; stdcall;
var
 DueTime: Int64;
begin
 DueTime := 0;
 {SetWaitableTimer 必須與 SleepEx 在同一線程}
 if SetWaitableTimer(hTimer, DueTime, 1000, @TimerAPCProc, nil, False) then
 begin
  SleepEx(INFINITE, True);
 end;
 Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 ID: DWORD;
begin
 {建立 WaitableTimer 對象}
 if hTimer = 0 then hTimer := CreateWaitableTimer(nil, True, nil);
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); {建立線程}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 CancelWaitableTimer(hTimer); {取消定時器}
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 CloseHandle(hTimer);
end;
end.

窗體文件:

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 113
 ClientWidth = 203
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
  Left = 55
  Top = 32
  Width = 97
  Height = 25
  Caption = #21551#21160#23450#26102#22120
  TabOrder = 0
  OnClick = Button1Click
 end
 object Button2: TButton
  Left = 55
  Top = 63
  Width = 97
  Height = 25
  Caption = #21462#28040#23450#26102#22120
  TabOrder = 1
  OnClick = Button2Click
 end
end
  使用 APC 回調函數(shù)才是 WaitableTimer 的正途, 下次該是如何給這個函數(shù)傳遞參數(shù)了.

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多