TBitmap、TCanvas 、TContext3D のマルチスレッド サポート
FireMonkey への移動
FireMonkey は、TBitmap、TCanvas、TContext3D のマルチスレッドをサポートしています。 ビットマップは、いずれのスレッドを介しても、作成、使用、そして削除することができます。キャンバスまたは 3D コンテキスト上での描画は内部的にシリアライズされます。つまり、描画するコードがいずれのスレッドでも実行できる一方で、複数のスレッドが同時に描画することができますが、内部的にはアクセスはシリアライズされており、一度に 1 つのスレッドのみがキャンバスまたは 3D コンテキストに対して描画できるようになっています。
TBitmap
TBitmap
は、マルチスレッドを完全サポートしています。 インスタンスは、同期することなく、任意のスレッド内で作成、削除、および修整することができます。
メモ: それでも、スレッド間でオブジェクトを共有する場合には、通常のスレッド同期が必要になります。これは、別のスレッドが使用している間にオブジェクトが削除されてしまわないようにするためです。また、ビットマップ アクセス回りで独自の同期を追加する場合には注意してください。デッドロックを起こす可能性があります。
TCanvas
TCanvas
およびすべてのサブクラスは、マルチスレッド環境をサポートしていますが、Canvas インスタンスの同時実行はサポートしていません。 これはつまり、Canvas が BeginScene
を呼び出した際、この BeginScene...EndScene
セクション内部のコードの実行は、他のキャンバスへの描画も含む、描画処理を試行するその他のスレッドをいずれもブロックすることを意味します。
BeginScene...EndScene
ブロックをは極力短く記述して、その他のスレッドのブロックを回避するようにします。
たとえば、次のように、
for I := 0 to 10000 do
begin
// thread work
Canvas.BeginScene;
try
// drawing code
finally
Canvas.EndScene;
end;
end;
次の代わりに記述します:
Canvas.BeginScene;
try
for I := 0 to 10000 do
begin
// thread code
// drawing code
end;
finally
Canvas.EndScene;
end;
TContext3D
TContext3D
はマルチスレッド環境をサポートしていますが、Context3D インスタンス群の同時実行をサポートしていません。 TCanvas
と同様の制限があります。