摘自"萬一的部落格"
functionmyfun(p: pointer): integer;stdcall;
vari: integer;
begin
fori := 0to500000do
begin
form1.canvas.lock;
form1.canvas.textout(10, 10, inttostr(i));
form1.canvas.unlock;
end;
result := 0;
end;
proceduretform1.button1click(sender: tobject);
var
id: thandle;
begin
createthread(nil, 0, @myfun,nil, 0, id);
end;
**分析:
createthread 乙個執行緒後, 算上原來的主線程, 這樣程式就有兩個執行緒、是標準的多執行緒了;
createthread 第三個引數是函式指標, 新執行緒建立後將立即執行該函式, 函式執行完畢, 系統將銷毀此執行緒從而結束多執行緒的故事.
createthread 要使用的函式是系統級別的, 不能是某個類(譬如: tform1)的方法, 並且有嚴格的格式(引數、返回值)要求, 不管你暫時是不是需要都必須按格式來;
因為是系統級呼叫, 還要綴上 stdcall, stdcall 是協調引數順序的, 雖然這裡只有乙個引數沒有順序可言, 但這是使用系統函式的慣例.
createthread 還需要乙個 var 引數來接受新建執行緒的 id, 儘管暫時沒用, 但這也是格式; 其他引數以後再說吧.
這樣乙個最簡單的多執行緒程式就出來了, 咱們再用 tthread 類實現一次
type繼承 tthread 主要就是實現抽象方法 execute(把我們的**寫在裡面), 等我們的 tmythread 例項化後, 首先就會執行 execute 方法中的**.tmythread =class(tthread)
protected
procedureexecute;override;
end;
proceduretmythread.execute;
var
i: integer;
begin
freeonterminate := true;
fori := 0to500000do
begin
form1.canvas.lock;
form1.canvas.textout(10, 10, inttostr(i));
form1.canvas.unlock;
end;
end;
proceduretform1.button1click(sender: tobject);
begin
tmythread.create(false);
end;
tthread 類有乙個抽象方法(execute), 因而是個抽象類, 抽象類只能繼承使用, 上面是繼承為 tmythread.
按常規我們一般這樣去例項化:
proceduretform1.button1click(sender: tobject);因為 mythread 變數在這裡毫無用處(並且編譯器還有提示), 所以不如直接寫做 tmythread.create(false);var
mythread: tmythread;
begin
mythread := tmythread.create(false);
end;
我們還可以輕鬆解決乙個問題, 如果: tmythread.create(true) ?
這樣執行緒建立後就不會立即呼叫 execute, 可以在需要的時候再用 resume 方法執行執行緒, 譬如:
proceduretform1.button1click(sender: tobject);var
mythread: tmythread;
begin
mythread := tmythread.create(true);
mythread.resume;
end;
//可簡化為:
proceduretform1.button1click(sender: tobject);
begin
withtmythread.create(true)doresume;
end;
類 create 了就要 free; 但 tthread(的子類) 有特殊性, 很多時候我們不能確定新建的執行緒什麼時候執行完(也就是什麼時候該釋放);
如果執行緒執行完畢自己知道釋放就好了, 所以 tthread 給了乙個布林屬性 freeonterminate, 如果為 true, 執行緒執行完畢後就會自釋放.
functioncreatethread(
lpthreadattributes: pointer;
dwstacksize: dword;
lpstartaddress: tfnthreadstartroutine;
lpparameter: pointer;
dwcreationflags: dword;
varlpthreadid: dword
): thandle;stdcall;
delphi 多執行緒
看別人的部落格一萬次記憶效果也沒那麼好,還是自己動手寫寫吧!functioncreatethread lpthreadattributes pointer dwstacksize dword lpstartaddress tfnthreadstartroutine lpparameter point...
delphi 多執行緒例項
下面筆者將介紹乙個簡單的例項,解釋和說明前面所述的內容。1 建立form,在其中建立兩個按鈕 開始採集 和 停止採集 新增乙個paintbox1。2 建立乙個新的單元,在其中輸入以下 unit collectthread inte ce uses classes,sysutils,stdctrls,...
delphi多執行緒釋放
delphi建立了多執行緒後,要想在執行完成後自動釋放所用的資源,可以在建構函式constructor裡指定 執行緒結束時的執行事件,onterminate finishedevent 這樣,當乙個執行緒執行完成後,就會自動呼叫 這個過程,當然,在建構函式裡還必須先有這兩句 inherited cr...