CreateThread函式使用

2021-04-25 23:45:50 字數 3728 閱讀 2017

摘自"萬一的部落格"

functionmyfun(p: pointer): integer;stdcall;

var

i: integer;

begin

fori := 0

to500000

do

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

tmythread =class(tthread)

protected

procedureexecute;override;

end;

proceduretmythread.execute;

var

i: integer;

begin

freeonterminate := true;

fori := 0

to500000

do

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.

繼承 tthread 主要就是實現抽象方法 execute(把我們的**寫在裡面), 等我們的 tmythread 例項化後, 首先就會執行 execute 方法中的**.

按常規我們一般這樣去例項化:

proceduretform1.button1click(sender: tobject);

var

mythread: tmythread;

begin

mythread := tmythread.create(false);

end;

因為 mythread 變數在這裡毫無用處(並且編譯器還有提示), 所以不如直接寫做 tmythread.create(false);

我們還可以輕鬆解決乙個問題, 如果: 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;

CreateThread函式 建立執行緒

微軟在windows api中提供了建立新的執行緒的函式createthread,概述 當使用createprocess呼叫時,系統將建立乙個程序和乙個主線程。createthread將在主線程的基礎上建立乙個新執行緒,大致做如下步驟 1在核心物件中分配乙個執行緒標識 控制代碼,可供管理,由crea...

多執行緒CreateThread函式的用法及注意事項

當使用createprocess呼叫時,系統將建立乙個程序和乙個主線程。createthread將在主線程的基礎上建立乙個新執行緒,大致做如下步驟 1在核心物件中分配乙個執行緒標識 控制代碼,可供管理,由createthread返回 2把執行緒退出碼置為still active,把執行緒掛起計數置1...

多執行緒CreateThread函式的用法及注意事項

原文出自 當使用createprocess呼叫時,系統將建立乙個程序和乙個主線程。createthread將在主線程的基礎上建立乙個新執行緒,大致做如下步驟 1在核心物件中分配乙個執行緒標識 控制代碼,可供管理,由createthread返回 2把執行緒退出碼置為still active,把執行緒掛...