Delphi另一個多線程函數:BeginThread
━━━━━━━━━━━━━━━━━━━━━━━━━━
Delphi也提供了一個相同功能的類似函數:
function BeginThread(
SecurityAttributes: Pointer;
StackSize: LongWord;
ThreadFunc: TThreadFunc;
Parameter: Pointer;
CreationFlags: LongWord;
var ThreadId: LongWord
): Integer;
━━━━━━━━━━━━━━━━━━━━━━━━━━
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
這里就用到了前面說到的Delphi RTL函數BeginThread,它有很多參數,關鍵的是第三、四兩個參數。
第三個參數就是前面說到的線程函數,即在線程中執行的代碼部分。
第四個參數則是傳遞給線程函數的參數,在這里就是創建的線程對象(即Self)。
第五個是用於設置線程在創建后即掛起,不立即執行(啟動線程的工作是在AfterConstruction中根據CreateSuspended標志來決定的),
第六個是返回線程ID。
━━━━━━━━━━━━━━━━━━━━━━━━━━
定義被BeginThread調用的函數
━━━━━━━━━━━━━━━━━━━━━━━━━━
聲明:type TThreadFunc : Function(Parameter : Pointer) : Integer;
描述:TThreadFunc定義了一個函數而不是數據。這個函數通常作為BeginThread函數的一個參數,BeginThread是一個單獨的線程運行時開始的。這個定義的TThreadFunc函數實現了線程的行為。
函數的返回代碼是線程的退出代碼。
uses
Forms, Dialogs, Windows, SysUtils;
type
TMsgRecord = record
thread : Integer;
msg : string[30];
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
Implementation
{$R *.dfm} // 包含窗體定義
ThreadVar // 必須允許每個線程有被傳遞增的記錄變量的實例
msgPtr : ^TMsgRecord;
// 私有的線程過程,用於顯示字符串
function ShowMsg(Parameter : Pointer) : Integer;
begin
// 設返回值為0
Result := 0;
// 映射指針到被傳遞進來的參數
// 每個線程有一份獨立的msgPtr副本
msgPtr := Parameter;
// 在指定坐標顯示對話框
ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,
200*msgPtr.thread, 100);
// 結束線程
EndThread(0);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
id1, id2 : LongWord;
thread1, thread2 : Integer;
msg1, msg2 : TMsgRecord;
showMsgFunc : TThreadFunc;
begin
// 指定線程函數地址
showMsgFunc := Addr(ShowMsg);
//初始化要顯示的
msg1.thread := 1;
msg1.msg := 'Hello World';
msg2.thread := 2;
msg2.msg := 'Goodbye World';
// 開始第一個線程
thread1 := BeginThread(nil,
0,
showMsgFunc,
Addr(msg1),
0,
id1);
// 開始第二個線程
thread2 := BeginThread(nil,
0,
showMsgFunc,
Addr(msg2),
0,
id2);
// 確保線程關閉前,線程應執行完成
ShowMessagePos('Press this when other dialogs finished.', 200, 300);
// 最后關閉線程
CloseHandle(thread1);
CloseHandle(thread2);
end;
end.
程序運行結果,顯示3個對話框:
Thread 1 Hello World
Thread 2 Goodbye World
Press this when other dialogs finished.
轉自https://www.xuebuyuan.com/467050.html