Hallo Forum,
meine Frage an Euch lautet: Gibts ein Threadsafes TBitmap? Mir ist bekannt, dass das
GDI nicht Threadsafe ist. Man müsste also einen anderen Image Container benutzen nur welchen?
Das
GDI Problem tritt auf, wenn in Threads Bitmapoperationen durchgeführt werden. Beim Anfragen nach einem
Handle TBitmap.Canvas.Handle wird eine OUT OF SYSTEMRESOURCES
EXCEPTION gerissen.
Nach einigen Sekunden krachts hier: [Anzahl der Threads: 2-8]
Delphi-Quellcode:
procedure TWorkerThread.Execute;
var
I: Integer;
ResultImage: TBitmap;
begin
QueryPerformanceFrequency(c);
FThreadID := GetCurrentThreadId;
while not Terminated do
case WaitForSingleObject(FControlSemaphore, 100) of
WAIT_OBJECT_0:
begin
if not (Terminated) and
(TAMImageCore.GetInstance.FQueueList <> nil) and
(TAMImageCore.GetInstance.JobList.GetQueueCount > 0) then
begin
ResultImage := TBitmap.Create;
ResultImage.HandleType := bmDIB;
Synchronize(Self, ThreadStart);
{ begin here -------------------}
BitBlt(IRGENDEIN_BTMAP.Canvas.Handle, 0, 0, IRGENDEIN_BTMAP.Width, IRGENDEIN_BTMAP.Height, IRGENDEIN_BTMAP.Canvas.Handle, 0, 0, SRCCOPY);
{ end here ---------------------}
Synchronize(Self, ThreadDone);
FreeAndNil(ResultImage);
FreeAndNil(TempQueueItem);
FreeAndNil(AMImageProcessor);
end;
end;
WAIT_TIMEOUT:
begin
OutputDebugString(PChar(Format('Worker [%d] gone to bed.', [FThreadID])));
Self.Suspend;
end;
end;
end;