インディ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 エンド。