全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2565
推到 Plurk!
推到 Facebook!

請問如何撰寫多執行緒

答題得分者是:banson1716
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-05 23:06:51 IP:211.74.xxx.xxx 未訂閱
請問各位高手,如何撰寫多執行緒,及是否有範例可供參考,謝謝!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-05 23:11:25 IP:61.221.xxx.xxx 未訂閱
引言: 請問各位高手,如何撰寫多執行緒,及是否有範例可供參考,謝謝!
kwon 你好: 請參考以下的連結文章 > --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
banson1716
高階會員


發表:55
回覆:182
積分:167
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-08 22:57:12 IP:61.223.xxx.xxx 未訂閱
------------------------------------------------------------------- DELPHI下的多線程程序設計 作 者:microrain 類 別:Delphi 發布時間:2002-2-27 8:39:23 我們知道,win95或winNT都是“多線程”的操作繫統,在DELPHI 2﹒0中,我們可以充分利用這一特性,編寫出“多線程”的應用程序。 對以往在DOS或16位windows下寫程序的人來說,“多線程”仍然是陌生的,但如同以前我們從DOS下的單任務過渡到windows3﹒1下的多任務,如今我們又必須過渡到“多線程”領域,畢竟計算機時代是在不斷發展的。不過,幸運的是,在DELPHI2﹒0下進行多線程程序設計並不需要我們去學習龐大的WIN32API函數,我們可以利用DELPHI下標準的多線程類TThread來完成我們的工作。 TThread是一個abstract(抽像)類,也就是說,並不需要根據TThread來聲明變量(而且根據TThread聲明的變量也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實際上,根據TThread來寫多線程應用程序是非常容易的。 下面就是一個基本的繼承TThread生成的多線程類。 QuerThrd﹒Pas unitQuerThrd; interface uses Classes,DBTables; type TQueryThreadΚclass(TThread) private fQuery:tQuery; protected procedureExecute;override; public constructorCreate(Suspended:Boolean;Query:TQuery); end; implementation constructor TQueryThread﹒Create(Suspended:Boolean;Query:TQuery); begin inheritedCreate(Suspended); fQuery:ΚQuery; FreeOnTerminate:ΚTrue; end; procedureTQueryThread﹒Execute; begin fQuery﹒Open; end; end﹒ 在上面這個簡單的例子中,我們構造了一個TThread的子類TQuery Thread,用於在後臺執行數據庫查詢。在該類的Create函數中,傳遞了兩個參數Suspended和Query,其中Suspended用於控制線程的運行,如果Suspend為真,TQueryThread類的線程在建立後將立即被懸掛,一直到運行了Resume方法,該線程纔會繼續執行,Query參數用於接受一個已經存在的Query控件(在窗體中真正的Query控件)而使它在多線程的情況下運行。Execute是最重要的過程,它是類TQueryThread的執行部分,所有需要在這個多線程類中運行的語句都必須寫在這個過程裡。 實際上構造自己的多線程類時,並不需要輸入所有的這些代碼,選擇DELPHI的File菜單下的new選項,再選“TThreadObject”項目,DELPHI就會為你構造基本的程序模塊。然後我們可以根據需要再做相應的修改。 進程的執行: 假設我們已經建立了一個窗體FORM1,窗體中有我們將要使用的查詢控件Query1。那麼我們在該單元的USES部分加入上面寫的QuerThrd單元。 procedureTForm1﹒Button1Click(Sender:TObject); begin ?建立一個運行的進程? TQueryThread﹒Create(False,Query1); end; 如果這個過程被執行,那麼窗體中的查詢控件Query1就會自動在多線程的環境下運行查詢。注意TQueryThread類中隻有Create而沒有Free,動態建立類以後又忘記刪除是我們常犯的錯誤之一,不過在這裡由於我們指定了FreeOnTerminate(運行完即刪除)為真,所以當Execute裡的語句執行完後,TQueryThread類占據的內存控件將被自動釋放。 然而還有一個問題值得我們注意,由於同一時刻可以有多個線程同時運行,那麼我們還必須解決好同步的問題,如果幾個多線程程序之間沒有任何關聯,那麼它們之間也不會有任何衝突。但實際上,可能同時運行幾個多線程的數據庫應用程序,由於需要共享相同的數據庫資源,我們還需要為Query1增加一個Tsession控件。 其實,雖然我們也許沒有親自使用過Session控件,但實際上,在所有的數據庫訪問時DELPHI都會自動建立一個臨時的Session控件,使用完後又動態地刪除掉它。在平常的數據庫編程時,用不著我們親自來操作,但在數據庫多線程執行的情況下,為了不相互衝突,我們必須為每個數據庫訪問都定制自己的Session控件。這個步驟非常簡單,我們隻需要在窗體中增加一個Session控件,然後給它的屬性“Sessionname”寫一個任意的名字,並再在Query1的“Sessionname”中寫一個相同的名字。這樣我們的數據庫程序就安全了。 另一類需要解決同步問題的是那些對VCL資源進行操作的程序,這類的程序非常多,好在解決的方法也非常簡單。 我們可以看下面這樣一個程序: unitBncThrd; interface uses WinProcs,Classes,Graphics,ExtCtrls; type TBounceThreadΚclass(TThread) private FShape:TShape; FXSpeed:Integer; FYSpeed:Integer; procedureMoveShape; protected procedureExecute;override; public constructorCreate(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer); propertyShape:TShapereadFShape; end; implementation procedureTBouad﹒MoveShape; var MaxHeight,MaxWidth:Integer; begin withFShapedo begin Left:ΚLeft+FXSpeed; Top:ΚTop+FYSpeed; if(LeftΙ0)or (Left+WidthΛParent﹒Width)then FXSpeed:ΚFXSpeed*-1; if(TopΙ0)or (Top+HeightΛPar ent﹒Height)then FYSpeed:ΚFYSpeed*-1; end; end; procedureTBounceThread﹒Execute; begin WhilenotTerminateddo begin Synchronize(MoveShape); end; end; constructorTBounceThread﹒Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer); begin inheritedCreate(Suspended); FShape:ΚShape; FXSpeed:ΚXSpeed;?X軸走向的速度? FYSpeed:ΚYSpeed;?Y軸走向的速度? FreeOnTerminate:ΚTrue; end; end﹒ 這是一個多線程的踫踫球遊戲,你可以有多個不同的球,它們分屬不同的線程,各自獨立的在屏幕上踫撞。顯然,由於多個球運行的顯示會同時操作VCL資源,為了安全,我們在Execute過程中的執行部分加入了Synchronize(MoveShape)來調用Move Shape過程,實際上,在任何需要操作VCL資源的地方,例如窗體、位圖,都應加入Synchronize調用。 執行時我們可以新建一個程序,然後在USES部分加入以上的BncThrd單元,再在它的窗體FORM1上加入兩個Shape控件Shape1和Shape2,Shape1可以是一個矩形而Shape2是一個圓。加入以下的代碼就可以讓矩形和圓動起來。 procedureTForm1﹒Button1Click(Sender:TObject); begin TBounceThread﹒Create(False,Shape1,1,2); TBounceThread﹒Create(False,Shape2,2,3); end;
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-11 22:39:17 IP:211.74.xxx.xxx 未訂閱
感謝 RaynorPao 及 banson1716 的熱心回答,等我消化後再回來請教各位高手,謝謝您們!
系統時間:2024-05-13 8:43:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!