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

2021-04-06 20:02:45 字數 2787 閱讀 5035

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

重慶郵電學院計算機系綜合微機室

馬英傑----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;

inte***ce

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);

varform1:tform1;

implementation

//這是執行緒函式,

它可以放在下面程式的任何地方

function   mythreadfunc(p:pointer):longint;stdcall;

vari: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);

varhthread: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按鈕時,不建立執行緒,我們會發現在程式沒有計算完之前根本不能做其它任何事情!

子執行緒中建立handler

方法1 android顯示操作介面,需要在主線程中執行 不在主線程中需要在handler中執行 looper.prepare myhandler new handler new handler.callback looper.loop 必須開始looper但是開啟的時刻可以自己控制 方法2 publ...

在子執行緒中Toast

問題 直接在普通子執行緒中toast會報錯 錯誤關鍵 1.普通的執行緒不能直接new乙個handle,而toast初始化 中如下 片 public class toast 2.為什麼普通執行緒不能new乙個handle?handle類 如下 public handler looper類中的 片段 p...

在子執行緒中操作主線程

當android啟動activity時,會先啟動乙個主線程 也稱為ui執行緒 用於控制activity的當前view介面,在主線程控制的過程中,子執行緒是不能直接更新主線程資料的,但是android中提供了很多其他執行緒操作ui執行緒的方法 方法一 activity.runonuithread ru...