![]() |
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:
:arrow: Irgendwelche Ideen?
// 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); Viele Grüße Zacherl |
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?
|
AW: CreateDIBSection() aus Thread heraus schlägt fehl
Ich finde einfach nicht die Fehlerursache. Kennt sich hiermit wirklich niemand aus? :(
|
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: ) |
AW: CreateDIBSection() aus Thread heraus schlägt fehl
Das wäre höchst ungut, da in meiner Konsolenanwendung komischerweise keine Thread Synchronization funktioniert :?
|
AW: CreateDIBSection() aus Thread heraus schlägt fehl
Kannst du mal beschreiben was du mit deinem Programm machen möchtest ?
|
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. |
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:
![]() 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 21:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz