與在主線程建立子執行緒的方法是一樣的
重慶郵電學院計算機系綜合微機室
馬英傑----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...