Multi-threading pour TBitmap, TCanvas et TContext3D

De RAD Studio
Aller à : navigation, rechercher

Remonter à FireMonkey


FireMonkey prend en charge le multi-threading pour TBitmap, TCanvas et TContext3D. Les bitmaps peuvent être créés, utilisés et supprimés par n'importe quel thread. L'action de dessiner sur un canevas ou un contexte 3D est sérialisée en interne. En d'autres termes, le code relatif au dessin peut être exécuté sur n'importe quel thread, et plusieurs threads peuvent dessiner en même temps ; l'accès interne est sérialisé de façon à ce qu'un seul thread puisse dessiner à la fois sur un canevas ou un contexte 3D.

TBitmap

TBitmap assure une prise en charge complète du multi-thread. Les instances peuvent être créées, détruites et modifiées dans n'importe quel thread sans synchronisation.

Remarque : Il faut toutefois une synchronisation des threads si vous partagez des objets entre plusieurs threads, de façon à assurer qu'un objet n'est pas supprimé lorsqu'un autre thread l'utilise. Vous devez également être prudent lorsque vous ajoutez votre propre synchronisation concernant l'accès des bitmaps. Cela peut générer sinon des verrous mortels.

TCanvas

TCanvas et toutes ses sous-classes assurent la prise en charge des environnements multi-thread, mais l'exécution simultanée des instances de Canvas n'est pas supportée. Cela signifie que lorsqu'un canevas appelle BeginScene, l'exécution du code à l'intérieur de cette section BeginScene...EndScene bloque n'importe quel autre thread qui tente de dessiner, y compris les dessins réalisés sur d'autres canevas.

Ecrivez des blocs BeginScene...EndScene le plus court possible pour éviter de bloquer d'autres threads.

Par exemple, écrivez :

for I := 0 to 10000 do
begin
  // thread work
  Canvas.BeginScene;
  try
    // drawing code
  finally
    Canvas.EndScene;
  end;
end;

Au lieu de :

Canvas.BeginScene;
try
  for I := 0 to 10000 do
  begin
    // thread code
    // drawing code
  end;
finally
  Canvas.EndScene;
end;

TContext3D

TContext3D assure la prise en charge des environnements multi-thread, mais l'exécution simultanée des instances de Context3D n'est pas supportée. Il connaît les mêmes limitations que TCanvas.

Voir aussi