AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadsafes TBitmap?

Ein Thema von creality · begonnen am 6. Feb 2008 · letzter Beitrag vom 6. Feb 2008
Antwort Antwort
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, 07: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
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#2

Re: Threadsafes TBitmap?

  Alt 6. Feb 2008, 08:00
Ich bin nicht der so der Multithreading experte aber soweit ich weiß kannst du das in einer TCriticalsection ausführen.
so das der Thread in dieser nicht unterbrochen wird.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von creality
creality

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

Re: Threadsafes TBitmap?

  Alt 6. Feb 2008, 08:20
Richtig. Das is aber nur ein Beispiel. Eigentlich steht statt BITBLT eine Klasse die Image Analysis durchführt. Das zu Syncen würde keinen Sinn mehr machen...denn dann wäre es keine Multithread Anwendung mehr.
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Threadsafes TBitmap?

  Alt 6. Feb 2008, 13:08
Das GDI nicht threadsafe ? Das bezweifle ich sehr. Jede Zeichenoperation auf dem Desktop findet notgedrungen mit dem GDI statt, also auch wenn mehrere Prozesse zugleich wild herumzeichnen. Ohne threadsafety wäre das unmöglich.

Ich tippe auf den Code, der zwischen "Begin here" und "End here" steht - der dürfte nicht threadsafe sein

[Edit]
...wenn es sich denn überhaupt um ein Threadproblem handelt. OUT OF RESOURCES läßt mich annehmen, das du hier >9999 GDI-Handles in deinem Prozeß alloziert hast. Dieses Problem habe ich auch schon gehabt und es führt unter Windows XP zu den absonderlichsten Fehlern...
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Threadsafes TBitmap?

  Alt 6. Feb 2008, 13:21
IRGENDEIN_BTMAP.lock();
Besucht doch mal meine Homepage
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Threadsafes TBitmap?

  Alt 6. Feb 2008, 15:25
Das Problem ist eher, das die VCL Grafikfunktionen nicht ansatzweise threadsafe sind. Dadurch kann es sehr gut zu einer solchen EOutOfResources kommen, schon allein aus dem Fakt, dass die VCL diese Exception grundsätzlich schmeisst bei einer abschlägig beantworteten WinAPI GDI Funktion, ohne näher zu schauen, ob es wirklich ein solches Resources Problem ist.

Mit anderen Worten: nutze kein TBitmap sondern direkt die GDI Objekte, also HBITMAP, etc
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz