Multithreading für TBitmap, TCanvas und TContext3D

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey


FireMonkey unterstützt Multithreading für TBitmap, TCanvas und TContext3D. Bitmaps können in jedem Thread erstellt, verwendet und gelöscht werden. Das Zeichnen in einem Zeichenbereich (Canvas) oder 3D-Kontext wird intern serialisiert; das heißt, während der Code, der das Zeichnen durchführt, in jedem Thread ausgeführt werden kann, und mehrere Threads gleichzeitig zeichnen können, wird der interne Zugriff serialisiert, sodass jeweils nur ein Thread in einen Zeichenbereich oder 3D-Kontext zeichnen kann.

TBitmap

TBitmap verfügt über eine umfassende Unterstützung für Multithreading. Instanzen können in jedem Thread ohne Synchronisierung erstellt, freigegeben und geändert werden.

Hinweis: Sie benötigen weiterhin eine normale Thread-Synchronisierung, wenn Sie Objekte in Threads gemeinsam nutzen, um sicherzustellen, dass ein Objekt nicht gelöscht wird, während es von einem anderen Thread verwendet wird. Seien Sie auch vorsichtig beim Hinzufügen einer eigenen Synchronisierung beim Bitmap-Zugriff. Dadurch könnten Deadlocks verursacht werden.

TCanvas

TCanvas und alle Unterklassen unterstützen Multithread-fähige Umgebungen, die simultane Ausführung von Canvas-Instanzen wird aber nicht unterstützt. Das bedeutet, dass die Ausführung des Codes in diesem BeginScene...EndScene-Abschnitt jeden anderen Thread blockiert, der versucht, das Zeichnen zu verarbeiten (einschließlich Zeichnen in andere Zeichenbereiche), wenn ein Canvas BeginScene aufruft.

Halten Sie BeginScene...EndScene-Blöcke so kurz wie möglich, um das Blockieren anderer Threads zu vermeiden.

Schreiben Sie beispielsweise:

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

Anstatt:

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

TContext3D

TContext3D unterstützt Multithread-fähige Umgebungen, die simultane Ausführung von Context3D-Instanzen wird aber nicht unterstützt. Für TContext3D gelten dieselben Einschränkungen wie für TCanvas.

Siehe auch