Multithreading für TBitmap, TCanvas und TContext3D
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.
Inhaltsverzeichnis
TBitmap
Mittels TBitmap
können Sie Instanzen in jedem Thread ohne Synchronisierung erstellen, freigeben und ändern.
Für viele Vorgänge erstellt TBitmap
jedoch auch zugeordnete TCanvas
-Klassen. Beachten Sie, dass einige TCanvas
-Klassen nicht Thread-sichere Konstrukte verwenden, wie z. B. die Klasse TMessageManager, was bei der Verwendung von TBitmap
zu Fehlern führen kann.
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
.