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 Multithreading und TForm.Create(self) - geht das? (https://www.delphipraxis.net/83145-multithreading-und-tform-create-self-geht-das.html)

jaikai 28. Dez 2006 10:24


Multithreading und TForm.Create(self) - geht das?
 
Moin

Ich finde keine Informationen darüber ob und falls ja, wie ich in einem Thread eine Form self-createn kann. Geht das überhaupt?


Delphi-Quellcode:
procedure TKeyinside.Execute;
begin
  if DarfLaufen <> 'Nein' then begin
     if not Assigned(Form_Check) then begin
        Form_Check := TForm_Check.Create(self);
        Form_Check.INI_Auslesen;
        if Form_Check.Checkit = falsethen
           Form_Check.ShowModal;
        Form_Check.Destroy;
        Form_Check := nil;
        DarfLaufen := '';
        end;
     end;
end;


procedure TMainForm.Timer3Timer(Sender: TObject);
begin
   // Der Timer sollte ursprünglich nur zum lostreten eines Threads dienen
   // Testweise so eingebunden

   Keyinside := TKeyinside.Create(true);  //  Thread inaktiv erzeugen
   Keyinside.FreeOnTerminate := true;     //  Thread nach dem Beenden freigeben
   Keyinside.Resume;             //  Thread aktivieren

end;
Der Debugger meckert -> Die 'Execute' meckert jetzt, daß die Komponenten inkompatible sind.

Kann man in Threads Form.create(self) anwenden? - Wenn ja - wie gehts richtig?

Danke

Robert Marquardt 28. Dez 2006 10:33

Re: Multithreading und TForm.Create(self) - geht das?
 
Die VCL ist nicht threadfest, folglich lassen sich Forms nur im Hauptthread anlegen und funktionieren auch nur dort.

phreax 28. Dez 2006 10:38

Re: Multithreading und TForm.Create(self) - geht das?
 
Alos bei mir hat es mit folgendem code funktioniert...

Delphi-Quellcode:
procedure TTestThread.Execute;
begin
Synchronize(Showform);
end;

procedure TTestThread.Showform;
begin
form3:= TForm3.Create(Form1);
Form3.Show;
end;
probiers halt mal so aus Synchrnize muss halt sein...

jaikai 28. Dez 2006 10:52

Danke - klappt
 
Yep - und wie das läuft...


Danke

ulrich.b 28. Dez 2006 12:08

Re: Multithreading und TForm.Create(self) - geht das?
 
Und der Grund dafür ist, dass nur in der Application-Hauptschleife Windows - messages empfangen werden können und nur dort ... in keinem anderen Thread.
Und die Synchronize() - Methode versetzt die aufzurufende procedure in den Hauptschleifen - context!

Robert Marquardt 28. Dez 2006 12:27

Re: Multithreading und TForm.Create(self) - geht das?
 
Fragt sich nur wie lange. Messages kann man auch in einem Thread empfangen, aber die VCL ist sicher nicht auf solche Scherze eingerichtet. Bitte sein lassen.

ulrich.b 28. Dez 2006 14:37

Re: Multithreading und TForm.Create(self) - geht das?
 
Zitat:

Zitat von Robert Marquardt
Bitte sein lassen.

Also das verstehe ich jetzt überhaupt nicht! Wenn ein TForm erst einmal im Hauptthread einer Application läuft, verhaltet sie sich wie jede andere form auch, daher können keine Fehler (Exceptions) passieren noch gibt es Performanceprobleme.

Robert Marquardt 28. Dez 2006 16:32

Re: Multithreading und TForm.Create(self) - geht das?
 
Es wird aber nur das Show synchronisiert.

ulrich.b 29. Dez 2006 10:46

Re: Multithreading und TForm.Create(self) - geht das?
 
OK, .... also erstens: Auch wenn mit Show() aufgerufen wird, werden alle folgenden Window-Messages, von denen das Window lebt auch im Hauptthread gesendet und verarbeitet (Das OS weiß ja gar nichts davon, in welchem Thread die Sychronisierung stattgefunden hat!!!)

Und Zweitens: Ruft man ein Fenster in diesem Zusammenhang sowieso zu 95% modal auf, da man im Thread ja das (Eingabe-)Ergebnis der Form benötigt, um fortzufahren (wie gesagt: meistens).


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