Delphi另一个多线程函数:BeginThread用法
<p>Delphi另一个多线程函数:BeginThread<br>━━━━━━━━━━━━━━━━━━━━━━━━━━</p><p>Delphi也提供了一个相同功能的类似函数:<br>function BeginThread(<br> SecurityAttributes: Pointer; <br> StackSize: LongWord; <br> ThreadFunc: TThreadFunc; <br> Parameter: Pointer; <br> CreationFlags: LongWord; <br> var ThreadId: LongWord<br>): Integer;<br>━━━━━━━━━━━━━━━━━━━━━━━━━━<br>FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);<br>这里就用到了前面说到的Delphi RTL函数BeginThread,它有很多参数,关键的是第三、四两个参数。<br>第三个参数就是前面说到的线程函数,即在线程中执行的代码部分。<br>第四个参数则是传递给线程函数的参数,在这里就是创建的线程对象(即Self)。<br>第五个是用于设置线程在创建后即挂起,不立即执行(启动线程的工作是在AfterConstruction中根据CreateSuspended标志来决定的),<br>第六个是返回线程ID。</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━<br>定义被BeginThread调用的函数<br>━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>声明:type TThreadFunc : Function(Parameter : Pointer) : Integer;</p>
<p>描述:TThreadFunc定义了一个函数而不是数据。这个函数通常作为BeginThread函数的一个参数,BeginThread是一个单独的线程运行时开始的。这个定义的TThreadFunc函数实现了线程的行为。</p>
<p>函数的返回代码是线程的退出代码。</p>
<p>uses<br>Forms, Dialogs, Windows, SysUtils;</p>
<p>type<br>TMsgRecord = record<br> thread : Integer;<br> msg : string;<br>end;<br>TForm1 = class(TForm)<br> procedure FormCreate(Sender: TObject);<br>end;</p>
<p>var<br>Form1: TForm1;</p>
<p>Implementation<br>{$R *.dfm} // 包含窗体定义</p>
<p>ThreadVar // 必须允许每个线程有被传递增的记录变量的实例</p>
<p>msgPtr : ^TMsgRecord;</p>
<p>// 私有的线程过程,用于显示字符串<br>function ShowMsg(Parameter : Pointer) : Integer;<br>begin<br>// 设返回值为0<br>Result := 0;</p>
<p>// 映射指针到被传递进来的参数<br>// 每个线程有一份独立的msgPtr副本<br>msgPtr := Parameter;</p>
<p>// 在指定坐标显示对话框<br>ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,<br> 200*msgPtr.thread, 100);</p>
<p>// 结束线程<br>EndThread(0);<br>end;</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br>var<br>id1, id2 : LongWord;<br>thread1, thread2 : Integer;<br>msg1, msg2 : TMsgRecord;<br>showMsgFunc : TThreadFunc;</p>
<p>begin<br>// 指定线程函数地址<br>showMsgFunc := Addr(ShowMsg);</p>
<p>//初始化要显示的<br>msg1.thread := 1;<br>msg1.msg := 'Hello World';<br>msg2.thread := 2;<br>msg2.msg := 'Goodbye World';</p>
<p>// 开始第一个线程<br>thread1 := BeginThread(nil,<br> 0,<br> showMsgFunc,<br> Addr(msg1),<br> 0,<br> id1);</p>
<p>// 开始第二个线程<br>thread2 := BeginThread(nil,<br> 0,<br> showMsgFunc,<br> Addr(msg2),<br> 0,<br> id2);</p>
<p>// 确保线程关闭前,线程应执行完成<br>ShowMessagePos('Press this when other dialogs finished.', 200, 300);</p>
<p>// 最后关闭线程<br>CloseHandle(thread1);<br>CloseHandle(thread2);<br>end;<br>end.</p>
<p>程序运行结果,显示3个对话框:<br>Thread 1 Hello World<br>Thread 2 Goodbye World<br>Press this when other dialogs finished.</p>
<p> </p>
<p>转自https://www.xuebuyuan.com/467050.html</p><br><br>
来源:https://www.cnblogs.com/zyb2016/p/11151918.html
頁:
[1]