スレッドの初期化
新しいスレッドクラスに初期化コードを記述したい場合,Create メソッドをオーバーライドする必要があります。スレッドクラスの宣言に新しいコンストラクタを追加し,実装部として初期化コードを記述します。ここで,このスレッドにデフォルトの優先度を割り当てます。また,このスレッドの実行が終了したときに,自動的にスレッドを解放するかどうかもここで指定します。
デフォルトの優先度を割り当てる
優先度とは,オペレーティングシステムがアプリケーション内のすべてのスレッド間の CPU 時間のスケジュールを作成する場合に,どのスレッドをどのぐらい優先するかを表します。処理速度に敏感なタスクを処理するスレッドには高い優先度を使い,それ以外のタスクを実行するスレッドには低い優先度を使用します。スレッドオブジェクトの優先度を表すには,Priority プロパティを設定します。
Windows アプリケーションを作成する場合は,Priority の値を以下の表の範囲で表します。
スレッドの優先度 :
値 | 優先度 |
---|---|
tpIdle |
スレッドは,システムがアイドルのときのみ実行される。tpIdle の優先度を持つスレッドを実行するために,Windows がほかのスレッドに割り込むことはない |
tpLowest |
スレッドの優先順位は通常よりも 2 ポイント低い |
tpLower |
スレッドの優先順位は通常よりも 1 ポイント低い |
tpNormal |
スレッドは通常の優先順位である |
tpHigher |
スレッドの優先順位は通常よりも 1 ポイント高い |
tpHighest |
スレッドの優先順位は通常よりも 2 ポイント高い |
tpTimeCritical |
スレッドは最も高い優先順位を取得する |
警告: CPU に処理が集中するスレッドの優先順位を高くすると,アプリケーション内のほかのスレッドを実行できなくなる可能性があります。優先順位を上げるスレッドは,ほとんどの時間を外部イベント待ちの状態で過ごすものだけにしてください。
次のコードは,バックグラウンドタスクを実行する優先度の低いスレッドのコンストラクタです。バックグラウンドタスクはアプリケーションのほかの処理のパフォーマンスを妨げてはなりません。
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
Priority := tpIdle;
end;
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended): TThread(CreateSuspended)
{
Priority = tpIdle;
}
//---------------------------------------------------------------------------
スレッドを解放するタイミングを指定する
通常は,スレッドの動作が終了した時点で簡単にスレッドを解放できます。この場合は,スレッドオブジェクトに自分自身を解放させるのが最も簡単です。それには,FreeOnTerminate プロパティを True に設定します。
一方,複数のスレッドの間で終了のタイミングを調整しなければならない場合もあります。たとえば,あるスレッドが値を返すのを待ってから別のスレッドを実行する場合などです。この場合は,2 番めのスレッドが戻り値を受け取るまで,1 番めのスレッドを解放できません。これを処理するには,まず FreeOnTerminate を False に設定し,次に 2 番めのスレッドから明示的に 1 番めのスレッドを解放します。