DELPHIのマルチスレッド(のTThreadクラス達成)

実装APIを学習する前に、のは、Delphiでカテゴリの下のTThreadを学びましょう。

まず、一般的なプロジェクトを作成し、新しいスレッドクラスファイルを作成する>>新>> Othre >> Delphiの[ファイル]> [スレッドオブジェクト、名前、Delphiが自動的にユニットを生成します、私たちは、コード内で簡単な機能を追加し、にする必要があります実施例に関連して使用される単位。

スペースを節約するために、メインフォーム集積ユニットTMyThreadクラスで、フォーム単位でクラスの宣言も可能です。

例:デジタル出力形式0ワーカースレッドで500,000。

コードをコピー
1つのユニットUnit1は、
 2 
 。3インターフェース
 4。
 5つの用途。
 6 Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、。
 7ダイアログ、StdCtrls; 
 8 
 。9種類
10 TMyThread =クラス(のTThread)
。11プライベート
12は、{プライベート宣言}であり、
13は保護された
14の手順を実行するステップと、オーバーライド; {実行} 
15実行手順を、{ここで記述された機能コードを呼び出し実行与える、複数のプロセスを宣言} 
16終了、
17 TForm1 =クラス(TFormは)
18 BTN1ある:のTButton; 
19プロシージャbtn1Click(。 SENDER:TObjectを); 
20プライベートで
21 {プライベート宣言}であり、
22はパブリックである
23パブリック宣言{ある} 
24エンド。
25 
26は、
27 
28 VAR 
TForm1; Form1の29 
30 
31である
32実装
33であり
34は$ {}であるDFM R&LT * 
35 
36 VAR 
37 MyThread:TMyThread; {宣言するクラス・オブジェクト・スレッド] 
38は
39手順TMyThread.Execute; 
40開始
41である{プレイスここでのコードの壁紙}スレッド
42がFreeOnTerminateです:=真; {フレーズプラススレッドが自動的に注釈を付けて実行されます} 
43の実行であり、
44はエンドであり、
45 
46は、手順TMyThread.Runであり、
47 VAR 
48は、I:整数; 
49始める
私のための50:= 0 500000に実行
開始された51 
52 Form1.Canvas.Lockであり; 
53 Form1.Canvas.TextOutある(10,10、IntToStr(I))。
Form1.Canvas.Unlock 54であり; 
55 END;  
56はエンドであり、
57であります
58プロシージャTForm1.btn1Click(送信者:TObjectを); 
59開始
60 MyThread:= TMyThread.Create(偽); {このクラスのインスタンスは、すぐに偽実行され、TrueにしてもよいですMyThread.Resume}可能にするために加えた
61端部です。
コードをコピー

 

クリティカルセクション(クリティカルセクション)

 SyncObjsを使用し、TCriticalSectionクラス処理方法。

例:99までのListBox 0を追加するために、3つのスレッド、と。

コードをコピー
1つのユニットUnit1は。
 2 
 3インターフェース
 4 
 図5は、使用
 6 Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、
 7つのダイアログ、StdCtrlsと、
 8 
 9種類
10 TMyThread =クラス(のTThread)
11プライベート
12 {プライベート宣言} 
13が保護
14の手順を実行します。オーバーライド; {}执行
15の手順を実行します。{运行} 
16の端部、
17 TForm1 =クラス(TFormは)
18 BTN1:のTButton。
19 LST1:TListBoxコンポーネント。
20手順btn1Click(送信者:TObjectを)。
21手順FormDestroy(送信者:TObjectを)。
22プライベート 
23 {プライベート宣言}
24公衆 
25} {公開宣言
26は端部である。
27 
28 
29 
30 VAR 
31 Form1がある:TForm1; 
32 
33であり、
34が実装されている
35 
DFM 36}、{$のR&* LT 
37 
38であるSyncObjsを使用して、
39 
40 VAR 
41 MyThreadある:TMyThread; {ステートメント}スレッド
42 CS:TCriticalSection; {重要な文は} 
43は
44で
、45の手順TMyThread.Execute 
開始された46 
{ここに置きスレッドコードの壁紙47} 
48 FreeOnTerminateを:=真; {フレーズプラススレッドが出て自動的に注釈を付け走る} 
の実行を49; {操作} 
端部50; 
51である
; 52は、プロシージャTMyThread.Runある
53がVARである
54 Iである:整数。 
始まる55 
{Iを使用して、のような他の人}; 56 CS.Enterあります
I 57のためのものである:= 0 100 - 1行う。
58開始
59 Form1.lst1.Items.Add(IntToStr(I)); 
60 END; 
61 CS.Leaveあり、{I切れ、次} 
62が端部である、
63は
64の手順(送信者:TObjectを)TForm1.btn1Click; 
65開始
66 CS:= TCriticalSection.Create; {臨界インスタンス化} 
67 MyThread:= TMyThread.Create(偽); {このクラスのインスタンスは、すぐに偽実行され、真でありますMyThread.Resume}可能にするために添加することができる
68 MyThread:= TMyThread.Create(false)を、
69 MyThread:= TMyThread.Create(偽); 
70 END; 
71である
72 
73 TForm1.FormDestroy手順(送信者:TObjectを)は、
74開始
75 CS.Free; {放出臨界本体} 
76 END; 
77 
78の終了。
コードをコピー

 

ミューテックス(相互排他オブジェクト)

SyncObjsを使用し、TMutexクラスを治療する方法で(外部循環中文が決定された実行順序を放出することができます)

例:デジタル0〜2000は異なる位置に形成するための3つの排他的な出力。

コードをコピー
1つのユニットUnit1は。
 2 
 3インターフェース
 4 
 図5は、使用
 6 Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、
 7つのダイアログ、StdCtrlsと、
 8 
 9種類
10 TMyThread =クラス(のTThread)
11プライベート
12 {プライベート宣言} 
13が保護
14の手順を実行します。オーバーライド; {}执行
15の手順を実行します。{运行} 
16の端部、
17 TForm1 =クラス(TFormは)
18 BTN1:のTButton。
19手順FormDestroy(送信者:TObjectを)。
20手順btn1Click(送信者:TObjectを)。
21プライベート
22 {プライベート宣言} 
23公衆
パブリック宣言} {24 
25 END; 
26である
27 
28 
29 VAR 
30をForm1:TForm1; 
31である
32 
33が実装である
34である
} {$のR&LT DFM 35 * 
36 
37 [SyncObjsを使用し、
38は
39 VAR 
MyThread 40:; {文スレッドTMyThread}は
41ミューテックスであります:TMutexは、{ステートメントミューテックス} 
42がFである:整数、
43は
44であり
、45プロシージャTMyThread.Execute 
開始される46 
{ここでプレーススレッドコード壁紙47} 
:=真; {語句プラス糸が切れ自動的に注釈付き48 FreeOnTerminateを} 
49実行; {操作} 
50 END; 
51である
52れる手順TMyThread.Runは、
53がVARで
54 I、Yである:整数。 
始まる55
incは56(F)であり、
57はYである:* = 20はFであり; 
58 iについて:= 0〜2000実行
開始59 
60 IF Mutex.WaitFor(無限の)= {次に、判定機能をwrSignaled、任意の時間を使用する} 
61が開始され
62をForm1あります。 Canvas.Lock; 
; 63 Form1.Canvas.TextOut(10、Y、IntToStr(I))で
64 Form1.Canvas.Unlock; 
65スリープ(1); 
66 Mutex.Release; {リリースで行く} 
67終了; 
68 END; 
69 END; 
70 
71 TForm1.btn1Click手順(送信者:TObjectを)は、
72始まる
F 73である:= 0; 
74リペイント; 
75ミューテックス:= TMutex.Create(偽); {パラメータは、作成者が持っている許可するかどうかでありますミューテックス、典型的には}偽 
78 MyThread:= TMyThread.Create(偽)。 
76 MyThread:= TMyThread.Create(偽)。
MyThread 77:(偽)= TMyThread.Create; 
79 END; 
80 
81手順TForm1.FormDestroy(送信者:TObjectを)
82が開始
{解放ミューテックス}; 83 Mutex.Free 
84 END; 
85 
86終了。
コードをコピー

 

セマフォ(セマフォ信号またはコール)

 {セマフォをサポートしていDELPHI2007は、DELPHI2009はサポートを開始しました}

コードをコピー
1つのユニットUnit1は。
 2 
 3インターフェース
 4 
 図5は、使用
 6 Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、
 7つのダイアログ、StdCtrlsと、
 8 
 9種類
10 TForm1 =クラス(TFormは)
11ボタン1:のTButton。
12 EDIT1:TEDIT。
13手順Button1Click(送信者:TObjectを)。
14手順FormCreate(送信者:TObjectを)。
15手順FormDestroy(送信者:TObjectを)。
16手順Edit1KeyPress(送信者:TObjectを、VARキー:チャー); 
17端; 
18 
19 VAR 
20をForm1:TForm1。
21 
22実装
23 
24 {$器R *の.DFM} 
25
26はSyncObjsを使用しています。
27 VAR 
28 F:整数; 
29 MySemaphore:TSemaphore。
30 
31関数MyThreadFun(P:ポインタ):DWORD。STDCALL; 
32 VAR 
33 I、Y:整数。
34開始
35社(F)を、
36 Y:= 20 * F。
37 MySemaphore.WaitFor(INFINITE)を、wrSignaled IF = 
38開始
iについて39 = 1000 0〜ん
40始まる
41 Form1.Canvas.Lockと、
42 Form1.Canvas.TextOut(20、Y、IntToStr(I))。
43 Form1.Canvas.Unlock。
44スリープ(1)。
45端; 
46エンド; 
47 MySemaphore.Release; 
48結果:= 0; 
49エンド;
50
手順TForm1.Button1Click 51は、(送信者:TObjectを)は、
52がVARである
53のThreadIDれる:DWORD; 
54が開始され
55に割り当てられた(MySemaphore)次にMySemaphore.Free IF; 
56 MySemaphore:5 ,. = TSemaphore.Create(NIL、StrToInt(Edit1.Text) 「); {作成し、nilに番号を実行して、セキュリティ・スレッドのデフォルトパラメータ、パラメータ2を満たすことができる、3動作パラメータの総数であり、パラメータは、マルチプロセス4を挙げることができる} 
57で
58 Self.Repaint; 
59 F:= 0 ; 
60のCreateThread(NIL、0、@MyThreadFun、ゼロ、0、のThreadID); 
61のCreateThread(NIL、0、@MyThreadFun、ゼロ、0、のThreadID)であり、
62のCreateThread(NIL、0、@MyThreadFun、ゼロ、0、のThreadIDあります); 
63のCreateThread(NIL、0、@MyThreadFun、ゼロ、0、のThreadID)であり、
64のCreateThread(NIL、0、@MyThreadFun、ゼロ、0、のThreadID); 
65 END; 
66
67 {让編集只接受1 2 3 4 5五个数} 
68手順TForm1.Edit1KeyPress(送信者:TObjectを、VARキー:文字)。
69始まる
場合70ないCharInSet(キー、[ '1' .. '5'])[キー:=#0。
71端; 
72 
73手順TForm1.FormCreate(送信者:TObjectを)。
74開始
75 Edit1.Textを:= '1'; 
76エンド; 
77 
78手順TForm1.FormDestroy(送信者:TObjectを)。
79始まり
、次いで(MySemaphore)が割り当てMySemaphore.Free場合80と、
81端; 
82 
83終わり。
コードをコピー

 

 

 イベント(eventオブジェクト)

注意:APIを扱う比べて、このような段差一時停止開始後に方法はありません。

コードをコピー
  1つのユニットUnit1は。
  2 
  3インターフェース
  4 
  図5は、使用
  6 Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、
  7つのダイアログ、StdCtrlsと、
  8 
  9種類
 10 TMyThread =クラス(のTThread)
 11プライベート
 12 {プライベート宣言} 
 13が保護
 14の手順を実行します。オーバーライド; 
 15の手順を実行します。
 16端; 
 17 
 18 TForm1 =クラス(TFormは)
 19 BTN1:のTButton。
 20 BTN2:TButtonは、
 21 btn3:TButtonは、
 22 btn4:TButtonは、
 23手順btn1Click(送信者:TObjectを)。
 24手順FormDestroy(送信者:TObjectを)。
 48
 25手順btn2Click(送信者:TObjectを)。
 26手順btn3Click(送信者:TObjectを)。
 27手順btn4Click(送信者:TObjectを)。
 28手順FormCreate(送信者:TObjectを)。
 29プライベート
 30 {プライベート宣言} 
 31公衆
 32 {公開宣言} 
 33の端部、
 34 
 35 VAR 
 36をForm1:TForm1。
 37 
 38実装
 39 
 40 {$ Rの*の.DFM} 
 41 
 42 SyncObjsを使用します。
 43 
 44 VAR 
 45 F:整数。
 46 MyEvent:にTEvent。
 47 MyThread:TMyThread。
 49 {TMyThread} 
 50 
 51 
 52手順TMyThread.Executeであり; 
 53開始で
 継承されている54; 
 55 FreeOnTerminate:=真; {スレッドは、その取消完了} 
 ; 56が実行される
 57は端部である; 
 58 
 ; 59プロシージャTMyThread.Run 
 60 VAR 
 61はI、Yである:整数; 
 62は開始
 63株であること(F)であり、
 64 Y:20である= F *; 
 65 
 66 iについて:= 0〜20000行う
 始まる67を
 IF MyEvent.WaitFor(無限の)68 = {その後、イベントの開始と、いかなる場合で決定wrSignaledそして、一時停止}均一なイベント関連の制御スレッドを再生
 開始69 
 ; 70 Form1.Canvas.lockを
 、71 Form1.Canvas.TextOut(10、Y、IntToStr(I))で
 72 Form1.Canvas.Unlock; 
 73がスリープである(1)。
 74端; 
 75 
 76エンド。
 77 
 78 END; 
 79 
 80手順TForm1.btn1Click(送信者:TObjectを); 
 81始まる
 82リペイント; 
 83 F:= 0; 
 84割り当て(MyEvent)場合MyEvent.Free; {もしそうであれば、破壊する} 
 85 
 86 {パラメータ通常、空のセキュリティ設定、; 2パラメータには、コントロールが対象Flase一時停止した直後になると真の一時停止を手動で制御することができ、ある
 オブジェクトを実行するための87の3つのパラメータをTrueに確立されたコントロールオブジェクトの作成がサスペンド状態偽の後、 、オブジェクト名の4パラメーター、クロスプロセスのために、ないときにデフォルト''}で
 88 MyEvent:= TEvent.Create(NIL、真の、真の、 ''); {}イベントを作成する
 89 
 90終了、
 91 
 92プロシージャTForm1.btn2Click (送信者:TObjectを); 
 93 VAR 
 94 ID:DWORD; 
 95開始
 96 MyThreadを:= TMyThread.Create(偽); {スレッド作成} 
 97終了、
 98
 手順TForm1.btn3Click 99(送信者:TObjectを); 
100始めます
101 MyEvent.SetEvent; {} {スタートイベントクラスPulseEventは、最初の書き込み光走査タン後に起動しない} 
102 END; 
103 
104手順TForm1.btn4Click(送信者:TObjectを); 
105開始
106 MyEvent.ResetEventを{ポーズ} 
107 END; 
108 
手順TForm1.FormCreate 109(送信者:TObjectを); 
110開始
111 btn1.Caption:= 'イベントを作成する'; 
112 btn2.Caption:= 'は、スレッドを作成する'; 
113 btn3.Caption:= '開始'; 
114 btn4.Caption。 = '一時停止'; 
115 END; 
1 16 
117手順TForm1.FormDestroy(送信者:TObjectを); 
1 18始まる
119 MyEvent.Freeを{リリース} 
120 END; 
121 
122エンド。
コードをコピー

要約:

、多くにTEventをのTThreadクラスでマルチスレッドとTCriticalSection(クリティカルエリア)、TMutex(ミューテックス)の使用のsyncobjsを使用し、TSemaphore(信号オブジェクトは、D2009が始まっ)(イベントオブジェクト)それは、参照APIメソッドでしたいくつかの簡略化は、このようなイベント(イベントオブジェクト)として欠けているいくつかの機能を、そこにあるが、一時停止機能をステッピング後に開始が欠落しているが、基本的な同期のTThreadクラス宣言を実行し、プラスの過程で他の、十分に良いされていますFreeOnTerminate:=真、文の実行が自動的に解放するの後、方法は、(機能コード同期に設定することができるスレッドが)いくつかの非スレッドセーフ制御オブジェクトを同期させるために使用された、目標操作レイズ上で同時に複数のスレッドを避けます質問。

おすすめ

転載: www.cnblogs.com/linjincheng/p/11609218.html