実装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:=真、文の実行が自動的に解放するの後、方法は、(機能コード同期に設定することができるスレッドが)いくつかの非スレッドセーフ制御オブジェクトを同期させるために使用された、目標操作レイズ上で同時に複数のスレッドを避けます質問。