|
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
来源:https://www.cnblogs.com/zyb2016/p/11151918.html |