程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi編程時如何利用線程

用Delphi編程時如何利用線程

編輯:Delphi
----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按鈕時,不建立線程,我們會發現在程序沒有計算完之前根本不能做其它任何事情!
此程序在基於Windows95的Delphi3中運行通過。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved