Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi CreateDIBSection() aus Thread heraus schlägt fehl (https://www.delphipraxis.net/152343-createdibsection-aus-thread-heraus-schlaegt-fehl.html)

Zacherl 18. Jun 2010 23:48


CreateDIBSection() aus Thread heraus schlägt fehl
 
Hey,

ich habe es nun hinbekommen ein Bitmap per API zu erstellen und kann dieses auch auf der Festplatte speichern. Jetzt habe ich ein kurioses Problem. Und zwar schlägt CreateDIBSection() in unregelmäßigen Abständen fehl, wenn ich als Farbtiefe 8 bit verwende. Das ausschließlich bei 8 bit. Höhere oder tiefere Werte funktionieren einwandfrei.

Edit: Habe das mal weiter verfolgt und festgestellt, dass der Aufruf nur dann fehlschlägt, wenn er aus einem Thread heraus erfolgt. Hierbei ist es egal, ob der Thread die Delphi Kapselung TThread verwendet oder per CreateThread() oder BeginThread() erstellt wurde.

Der ErrorCode ist, wenn es fehlschlägt immer: ERROR_INVALID_PARAMETER.

Delphi-Quellcode:
// Canvas erstellen
  FCanvas := CreateCompatibleDC(0);
  // Bitmap erstellen
  FillChar(BMI, SizeOf(BMI), #0);
  with BMI do
  begin
    bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
    bmiHeader.biWidth := FWidth;
    bmiHeader.biHeight := FHeight;
    bmiHeader.biPlanes := 1;
    bmiHeader.biBitCount := PixelFormatToBitCount(FFormat);
    bmiHeader.biCompression := BI_RGB;
    bmiHeader.biSizeImage := 0;
    bmiHeader.biXPelsPerMeter := 0;
    bmiHeader.biYPelsPerMeter := 0;
    bmiHeader.biClrUsed := 0;
    bmiHeader.biClrImportant := 0;
  end;
  FBitmap := CreateDIBSection(FCanvas, BMI, DIB_RGB_COLORS, FMemory, 0, 0);
  if FBitmap = 0 then
  begin
    WriteLn(SysErrorMessage(GetLastError);
  end;
  SelectObject(FCanvas, FBitmap);
:arrow: Irgendwelche Ideen?

Viele Grüße
Zacherl

Zacherl 19. Jun 2010 16:38

AW: CreateDIBSection() schlägt fehl bei 8 bit Farbtiefe
 
Ich konnte das Problem nun weiter eingrenzen und habe festgestellt, dass der Aufruf nur dann fehlschlägt, wenn er aus einem Thread heraus aufgerufen wird. Was läuft da schief?

Zacherl 20. Jun 2010 19:11

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Ich finde einfach nicht die Fehlerursache. Kennt sich hiermit wirklich niemand aus? :(

turboPASCAL 20. Jun 2010 19:30

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Könnte es nicht sein das CreateDIBSection einfach nicht Threadsicher ist ?
( mir war so, als hät ich da mal etwas gelesen :gruebel: )

Zacherl 20. Jun 2010 20:36

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Das wäre höchst ungut, da in meiner Konsolenanwendung komischerweise keine Thread Synchronization funktioniert :?

turboPASCAL 20. Jun 2010 21:41

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Kannst du mal beschreiben was du mit deinem Programm machen möchtest ?

SirThornberry 20. Jun 2010 22:26

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Also das eine Api-Funktion nicht Threadsave ist währe mir neu. Das man Objekte (im Sinne der WIN-API) nicht einfach von einem Thread in einem anderen Thread nutzen kann wäre noch glaubhaft. Aber das man bestimmte API-Funktionen nur im zuerst erstellten Thread eines Prozesses verwenden kann habe ich noch nie gehört.
Das "nicht Threadsave" kenne ich so eigentlich nur von der Delphi-VCL durch Verwendung globaler Objekte die im Hauptthread initialisiert wurden (und somit an diesen Thread gebunden sind) oder eben das etwas nicht gegen den gleichzeitigen Zugriff von mehreren Threads aus abgesichert ist.

Zacherl 21. Jun 2010 05:53

AW: CreateDIBSection() aus Thread heraus schlägt fehl
 
Kanns mir irgendwie auch nicht vorstellen, dass die API aus einem Thread heraus nicht funktionieren soll. Ich will im Programm eigentlich nur einen Screenshot erstellen und speichern können:
http://www.delphipraxis.net/152315-w...speichern.html

Dies habe ich ja mittlerweile nun hinbekommen. Allerdings soll das Ganze in der Konsolenanwendung nun periodisch in einem Thread geschehen, wobei es aber sein kann, dass sich die Bildschirmauflösung oder Farbtiefe ändert. Deshalb scheidet ein Erzeugen des Bitmaps vor dem Thread-Start leider aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 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