Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponenten werden in Thread erstellt/Error 1400 (https://www.delphipraxis.net/91226-komponenten-werden-thread-erstellt-error-1400-a.html)

BillieJoe90 1. Mai 2007 23:13


Komponenten werden in Thread erstellt/Error 1400
 
Hallo,
in einem Thread erstelle ich folgendermaßen Komponenten:
Delphi-Quellcode:
  for i:=0 to length(covers)-1 do begin
    covers[i].chooseImage := TImage.Create(frmDlCover.scbCovers);
    covers[i].chooseRadio := TRadioButton.Create(frmDlCover.scbCovers);
    fileStream := TFileStream.Create('data/tmp' + IntToStr(i) + '.jpg', fmCreate or fmShareDenyWrite);
    frmDlCover.idHttp.Get(covers[i].smallURL,fileStream);
    fileStream.Free;

    covers[i].chooseImage.Picture.LoadFromFile('data/tmp' + IntToStr(i) + '.jpg');

    covers[i].chooseImage.Top := ((row-1)*75)+(row*10);
    covers[i].chooseImage.Left := ((col-1)*75)+(col*10);
    covers[i].chooseRadio.Top := covers[i].chooseImage.Top+76;
    covers[i].chooseRadio.Left := covers[i].chooseImage.Left+32;

    covers[i].chooseImage.Visible := true;
    covers[i].chooseRadio.Visible := true;
    covers[i].chooseImage.Parent := frmDlCover;
    covers[i].chooseRadio.Parent := frmDlCover;
  end;
Durch Ausprobieren habe ich herausgefunden, dass der Fehler "Error 1400. Ungültiges Fensterhandle" beim Schließen des Programmes von den letzten beiden Zeilen (die mit .Parent := ...) ausgelöst wird.

Tja... ich frage mich nun, warum :roll:
Irgendwie müssen diese ja bewirken, dass der Thread nicht geschlossen wird?!

Wäre dankbar, wenn mir jemand heöfen könnte :pale:

Nutze das Thread-Objekt... (nur so nebenbei)

Bernhard Geyer 2. Mai 2007 06:15

Re: Komponenten werden in Thread erstellt/Error 1400
 
Die VCL ist nicht thread-Save. Alle GUI-Controls müssen im Hauptthread der Anwendung erzeugt werden und dürfen auch nur dort zugegriffen werden. Diese Thread-Unsicherheit liegt auch darin begründet das die Win32 hier auch nicht Thread-Save ist.

Matze 2. Mai 2007 06:30

Re: Komponenten werden in Thread erstellt/Error 1400
 
Hi

Zitat:

Zitat von Bernhard Geyer
[...] und dürfen auch nur dort zugegriffen werden.

Es ist jedoch möglich, synchronisiert in einem Thread auf die VCL zuzugreifen und das geht mit Delphi-Referenz durchsuchenSynchronize. Dies ist beispielsweise sinnvoll, um den Status einer Berechnung, Datenbankverbindung oder was auch immer im Thread ausgeführt wird, dem Anwender in einem TLabel oder ähnlichem zu übermitteln.

Beispiele hierzu findest du einige in der DP.

Nur ob es sinnvoll ist, Komponenten in einem eigenen Thread zu erstellen, bezweifle ich. Ich würde bei solchen Dingen die Daten, von denen das Erzeugen der Controls abhängt, intern speichern (TList, ...) und dann nach dem Auslesen auf einmal erzeugen.

Dezipaitor 2. Mai 2007 09:03

Re: Komponenten werden in Thread erstellt/Error 1400
 
Zitat:

Zitat von Bernhard Geyer
Diese Thread-Unsicherheit liegt auch darin begründet das die Win32 hier auch nicht Thread-Save ist.

Warum denn das? Ich verwende Win32 API Controls in mehreren Threads ohne Probs.
Das einzige was man nicht machen darf, ist direkt mit den WindowHandles über Threadgrenzen rumspielen, da diese nur vom Erstellerthread direkt geändert werden dürfen. Sonst gibt es : "Ungültiges Windowhandle"-Fehler.

Sonstige Änderungen, werden eh nur durch SendMessage erwirkt, welches threadsicher ist.

Bernhard Geyer 2. Mai 2007 09:07

Re: Komponenten werden in Thread erstellt/Error 1400
 
Zitat:

Zitat von Dezipaitor
Warum denn das? Ich verwende Win32 API Controls in mehreren Threads ohne Probs.

Dann hast du bisher Glück gehabt.

Zitat:

Zitat von Dezipaitor
Das einzige was man nicht machen darf, ist direkt mit den WindowHandles über Threadgrenzen rumspielen, da diese nur vom Erstellerthread direkt geändert werden dürfen. Sonst gibt es : "Ungültiges Windowhandle"-Fehler.

Und weist du was intern von der VCL Windows-Handle-Relevantes erledigt wird wenn du das Control erzeugst oder die Controls freigegeben werden oder irgendwelche Aktualisierungsevents anliegen?

Robert Marquardt 2. Mai 2007 09:10

Re: Komponenten werden in Thread erstellt/Error 1400
 
Win32 Controls nicht threadfest? Das ist mir neu. Welche denn?


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