Multi-threading pour TBitmap, TCanvas et TContext3D
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.
Sommaire
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
.