Thema: Delphi Threadsafes TBitmap?

Einzelnen Beitrag anzeigen

Benutzerbild von creality
creality

Registriert seit: 14. Mai 2007
Ort: Double D Town
39 Beiträge
 
Delphi 2007 Professional
 
#1

Threadsafes TBitmap?

  Alt 6. Feb 2008, 08:50
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;
  Mit Zitat antworten Zitat