TBitmap、TCanvas 、TContext3D のマルチスレッド サポート

提供: RAD Studio
移動先: 案内検索

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 と同様の制限があります。

関連項目