1. 程式人生 > >在子執行緒中建立執行緒的方法

在子執行緒中建立執行緒的方法

 
與在主執行緒建立子執行緒的方法是一樣的

重慶郵電學院計算機系綜合微機室
馬英傑
----Windows95是Microsoft公司的第一個真正的多工作業系統。在每一時刻可以有多個程序同時工作,而每一個程序又包含有多個執行緒。但只有一個處理器的計算機不可能真正地“同時”執行多個執行緒,而是作業系統把時間分成若干個時間片,然後把一個個時間片分配給每一個執行緒。

----一個執行了的程式就是一個程序,一個程序則至少有一個主執行緒。一位高階程式設計師,絕不會讓自己的程式裡面只有一個主執行緒存在(除非只有很少的幾十行程式碼),而是儘量讓自己的程式在同一時刻裡幹更多的事,在比較大一點的應用中尤其如此,象資料庫應用程式,在統計的時候我還想做其他事呢!因此,如何有效地利用執行緒則是每一個程式設計師都應瞭解的。本文就此簡單地談一下在Delphi中如何利用執行緒。

----(一)當使用執行緒時,我們主要有兩個任務:
----(1)建立一個執行緒。
----(2)建立一個能作為執行緒入口的函式。
----WindowsAPI呼叫CreateThread函式來建立一個執行緒。函式如下:

HANDLE   CreateThread(LPSECURITY_
ATTRIBUTESlpThreadAttributes,
//執行緒安全屬性地址
DWORDdwStackSize,
//初始化執行緒堆疊尺寸
LPTHREAD_START_ROUTINElpStartAddress,
//執行緒函式所指向的地址
LPVOIDlpParameter,
//給執行緒函式傳遞的引數
DWORDdwCreationFlags,
//有關執行緒的標誌
LPDWORDlpThreadId
//系統分配給執行緒的ID
);
----第一個引數是安全屬性,一般設為nil,使用預設的安全屬性。當我們想此執行緒有另外的子程序時,可改變它的屬性。
----第二個引數是執行緒堆疊尺寸,一般設為0,表示與此應用的堆疊尺寸相同,即主執行緒與建立的執行緒一樣長度的堆疊。並且其長度會根據需要自動變長。
----第三個引數,也是最重要的一個,是一個指向函式名的指標,但傳遞時很簡單,只需線上程函式名前加上@就可以了。
----第四個引數是你需要向執行緒函式傳遞的引數,一般是一個指向結構的指標。不需傳遞引數時,則這個引數設為nil。
----第五個引數,傳入與執行緒有關的一些標誌,如果是CREATE_SUSPENDED,則建立一個掛起的執行緒,即這個執行緒本身已建立,它的堆疊也已建立。但這個執行緒不會被分配給CPU時間,只有當ResumeThread函式被呼叫後才能執行;當然,也可以呼叫SuspendThread函式再次掛起執行緒。要是標誌為0,那麼一旦建立執行緒,執行緒函式就被立即呼叫。一般傳為0即可。
----最後一個引數是系統分配給這個執行緒的唯一的ID標誌。
----下面這個程式MyThreadPro.pas介紹了執行緒如何建立及使用:

//Your   first   test   Thread   Program.
unit   MyThreadPro;
interface
uses
Windows,Messages,SysUtils,Classes,
Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TForm1=class(TForm)
UsedThread:TButton;
NoUsedThread:TButton;
procedure   UsedThreadClick(Sender:TObject);
procedure   NoUsedThreadClick(Sender:TObject);
var
Form1:TForm1;
implementation
{$R*.DFM}
//這是執行緒函式,
它可以放在下面程式的任何地方
function   MyThreadFunc(P:pointer):Longint;stdcall;
var
i:integer;
DC:HDC;
S:string;
begin
DC:=GetDC(Form1.Handle);
for   i:=0   to   100000   do   begin
S:=Inttostr(i);
Textout(DC,10,10,Pchar(S),length(S));
end;
ReleaseDC(Form1.Handle,DC);
end;
procedure   TForm1.UsedThreadClick(Sender:TObject);
var
hThread:Thandle;//定義一個控制代碼
ThreadID:DWord;
begin
//建立執行緒,同時執行緒函式被呼叫
hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
ifhThread=0then
messagebox(Handle,'Didn’tCreateaThread',nil,MB_OK);
end;
procedure   TForm1.NoUsedThreadClick(Sender:TObject);
begin
MyThreadfunc(nil);
//沒有建立執行緒時,直接呼叫執行緒函式
end;
end.
----上面這個程式介紹了我們在使用執行緒及未使用執行緒二種情況下,執行該程式的反應。當點UsedThread按鈕時,則建立一個執行緒,這時我們可以在程式進行計算的同時,改變窗體的尺寸及移動它。當按下NoUsedThread按鈕時,不建立執行緒,我們會發現在程式沒有計算完之前根本不能做其它任何事情!