多線(xiàn)程編程(3) - 從 CreateThread 說(shuō)起[續]。
function CreateThread(
lpThreadAttributes: Pointer;
dwStackSize: DWORD;
lpStartAddress: TFNThreadStartRoutine;
lpParameter: Pointer;
dwCreationFlags: DWORD; {啟動(dòng)選項}
var lpThreadId: DWORD
): THandle; stdcall;
CreateThread 的倒數第二個(gè)參數 dwCreationFlags(啟動(dòng)選項) 有兩個(gè)可選值:
0: 線(xiàn)程建立后立即執行入口函數;
CREATE_SUSPENDED: 線(xiàn)程建立后會(huì )掛起等待.
可用 ResumeThread 函數是恢復線(xiàn)程的運行; 可用 SuspendThread 再次掛起線(xiàn)程.
這兩個(gè)函數的參數都是線(xiàn)程句柄, 返回值是執行前的掛起計數.
什么是掛起計數?
SuspendThread 會(huì )給這個(gè)數 +1; ResumeThread 會(huì )給這個(gè)數 -1; 但這個(gè)數最小是 0.
當這個(gè)數 = 0 時(shí), 線(xiàn)程會(huì )運行; > 0 時(shí)會(huì )掛起.
如果被 SuspendThread 多次, 同樣需要 ResumeThread 多次才能恢復線(xiàn)程的運行.
在下面的例子中, 有新線(xiàn)程不斷給一個(gè)全局變量賦隨機值;
同時(shí)窗體上的 Timer 控件每隔 1/10 秒就把這個(gè)變量寫(xiě)在窗體標題;
在這個(gè)過(guò)程中演示了 ResumeThread、SuspendThread 兩個(gè)函數.
運行效果圖:

代碼文件:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
hThread: THandle; {線(xiàn)程句柄}
num: Integer; {全局變量, 用于記錄隨機數}
{線(xiàn)程入口函數}
function MyThreadFun(p: Pointer): Integer; stdcall;
begin
while True do {假如線(xiàn)程不掛起, 這個(gè)循環(huán)將一直循環(huán)下去}
begin
num := Random(100);
end;
Result := 0;
end;
{建立并掛起線(xiàn)程}
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
Button1.Enabled := False;
end;
{喚醒并繼續線(xiàn)程}
procedure TForm1.Button2Click(Sender: TObject);
begin
ResumeThread(hThread);
end;
{掛起線(xiàn)程}
procedure TForm1.Button3Click(Sender: TObject);
begin
SuspendThread(hThread);
end;
{下面是窗體代碼}
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval := 100;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Text := IntToStr(num);
end;
end.
聯(lián)系客服