デルファイ - インディTIdThreadComponentスレッドの研究

 

インディIdThreadComponentスレッド研究

 

数日前のリアルタイムデータ解析機能モジュールの開発に、彼らは特に時間のかかる手続きは、画面仮死を実行し、分析データの膨大な量を発見しました。

ユーザーエクスペリエンスを最適化するためには、インディを使用すると、この問題に対する完璧なソリューション、IdThreadComponent制御をしています。

以下は、主要なプロパティとメソッドの一部にIdThreadComponentレコードを、次のとおりです。

 

1:IdThreadComponentプロパティ

ここではアクティブ、優先順位とStopModeプロパティに関する主な記録。

アクティブ:あなたはIdThreadComponent効果、Trueに設定を取るように制御するために必要がある場合、デフォルトはfalse;

優先度:ノーマルを選択し、スレッド間の競合を避けるために、システムは、優先順位を割り当てることが付属しています。

StopMode:ここでは、2つの種類に分かれているがスローダウンして終了を待つために一時停止、強制終了され終了し、終了し、サスペンド。

 

2:IdThreadComponent方法

TIdThreadComponentは、すべてのイベントがコールバックされているObserverパターンを使用します。

一般的にはより多くの時間のかかる操作がでOnRun上で行われます。

次のようにイベントの実行順序は次のとおりです。

前に実行します。

実行する前には、

ランオン; 

停止オン;

実行した後には、

後に実行オン。

 

3:次のデモで示されています

あなたは説明する必要があります。

スレッドに制御するための使用がある場合は、あなたが最初にする必要があり、TIdThreadComponentコールバックイベントはので、例外をスロー時々コントロールが破棄されているので、直接、ユーザインタフェースに制御することができないと、スレッドはまだ、その後、直接行動のAVを実行していますこれは、コントロールが空であるかどうかを判断ありません。

次のようにインターフェイスは、次のとおりです。

コードは以下の通りであります:

  1つの 単位uMain。
  2  
  3  インターフェース
  4  
  図5は、 使用
  6    Windowsの、メッセージ、sysutilsの、変異体、クラス、グラフィックス、コントロール、フォーム、
   7つの   ダイアログ、RzButton、StdCtrls、RzEdit、IdBaseComponent、IdThreadComponentと、
  8  
  9  種類
10    TMainFrm = クラス(TFormは)
 11      IDTrd:TIdThreadComponent。
12      mmMsg:TRzMemo。
13      btnStart:TRzBitBtn。
14      btnStop:TRzBitBtn。
15      btnTerminal:TRzBitBtn。
16      手順btnStartClick(送信者:TObjectを)。
17      手順IDTrdRun(送信者:TIdCustomThreadComponent)。
18      手順IDTrdBeforeExecute(送信者:TIdCustomThreadComponent)。
19      手順IDTrdAfterExecute(送信者:TIdCustomThreadComponent)。
20      手順btnStopClick(送信者:TObjectを)。
21      手順btnTerminalClick(送信者:TObjectを)。
22      手順IDTrdAfterRun(送信者:TIdCustomThreadComponent)。
23      手順IDTrdBeforeRun(送信者:TIdCustomThreadComponent)。
24      手順IDTrdStopped(送信者:TIdCustomThreadComponent)。
25    プライベート
26      {プライベート宣言} 
27    公衆
28      { 公開宣言} 
29    の端部30  
31  VAR 
32    MainFrm:TMainFrm。
33  
34  実装
35  
36  { $ Rの*の.DFM } 
37  
38  手順TMainFrm.btnStartClick(送信者:TObjectを)。
39は 開始
40    IDTrd.Active:= 真;
41  端部42  
43  手順TMainFrm.IDTrdRun(送信者:TIdCustomThreadComponent)。
44  VAR
45    ;:I整数
 46は 開始
47    するため = I 1を。  100  ない
48    始める
49      mmMsg.Lines.Add(IntToStr(I)); // アナログかかる操作
50    エンド51である   // スレッドで直接動作しませんインターフェースコントロール、コントロールが破棄されると、スレッドがまだ実行され、時には、
52    // この時間が異常AVが報告され、
53    // ので、コントロールを使用する必要があり、制御がTIdThreadComponentにおける空コールバックイベントであるかどうかを決定するために添加しなければならない
54  終了;
 55  
56である 手順TMainFrm.IDTrdBeforeExecute(送信者:TIdCustomThreadComponent);
 57は 開始
58    IF(mmMsg)に割り当てられ、その後
59は   開始
60      (mmMsg.Lines.Addを' 前に実行' );
61    端部62  エンド;
63  
64  手順TMainFrm.IDTrdAfterExecute(送信者:TIdCustomThreadComponent)。
65  開始
66を   場合(mmMsg)が割り当てられ、次いで
67は   開始
68      (mmMsg.Lines.Addを' 後に実行' )。
69    エンド;
70  エンド;
71  
72  手順TMainFrm.btnStopClick(送信者:TObjectを);
73  開始
74    IDTrd.Stopと、
75  端部76  
77  手順TMainFrm.btnTerminalClick(送信者:TObjectを)。
78  開始
79    IDTrd.Terminateと、
80  端部81  
82  手順TMainFrm.IDTrdAfterRun(送信者:TIdCustomThreadComponent)。
83  開始
84を   場合(mmMsg)を割り当て、次に
85は   開始
86      (mmMsg.Lines.Add ' 実行した後に' );
87    エンド;
88  エンド;
89  
90  手順TMainFrm.IDTrdBeforeRun(送信者:TIdCustomThreadComponent)。
91  開始
92    場合(mmMsg)が割り当てられ、その後
93は   開始
94      mmMsg.Lines.Add(' ファイル名を指定して実行する前に' );
95    端部96  端部97  
98  手順TMainFrm.IDTrdStopped(送信者:TIdCustomThreadComponent)。
99  始まる
100を   場合(mmMsg)が割り当てられ、次いで
101は   開始
102      mmMsg.Lines.Addを(停止オン);
103    ;
104  ;
105  
106  エンド

 

おすすめ

転載: www.cnblogs.com/jeremywucnblog/p/11428598.html