Delphi另一個多線程函數:BeginThread用法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM