![]() |
Formular im Thread erzeugen
Hi.
Eigentlich will ich (nur!) in einem separaten Thread ein Formular erzeugen. Also Benutzer startet Verarbeitung (Thread) von Daten. Während er Verarbeitung kann es sein, dass der Benutzer eine Entscheidung treffen soll. Dazu sollte Ihm ein Formular angezeigt werden. Der Thread sollte während dessen pause machen und nachdem der User sich entschieden hat weiterarbeiten. Theoretisch so:
Delphi-Quellcode:
Nun geht das ja bekanntlich nicht, da die VCL nicht threadsicher ist.
procedure ThreadExecute(...);
begin ... verarbeite Daten if LogfileVoll then begin frmForm1 : TfrmForm1.Create(); frmForm1.ShowModal; --> im OnShow von frmForm1 'Thread.Wait' Thread.Resume; end; end; Wie kann ich also während ein Thread läuft, diesen anhalten und ein Formular für eine Benutzereingage anzeigen??? Gruß Christian |
Re: Formular im Thread erzeugen
Hallo,
verpacke die Anzeige einer Form in eine Methode deiner MainForm und rufe diese Methode aus dem Thread mit Synchronize() auf. Grüße vom marabu |
Re: Formular im Thread erzeugen
1. Du benutzt messagebox (das ist direkt von Windows), kann allerdings nur eine Meldung anzeigen.
2. Du erzeugst das Fromular im Hauptthread. du sendest mit sendmessage eine Nachricht an den Hautpthread (dadruch wartetet der Thread bis der Hauptthread mit der Messagebearbeitung fertig ist) und tust dann in der Messagebearbeitung ein Formular anzeigen. 3. Du ertelsst ein nonVCL-Formular (CreateWindow etc. sieh Luckies Tutortials) |
Re: Formular im Thread erzeugen
@sirius
1. mit messagebox hab ich zu wenig Möglichkeiten. 2. läuft wohl auf Synchronize() hinaus. Diese Möglichkeit hatte ich auch schon im Kopf. Nur doof das synchronize() keine Parameter kann - muss ich halt mit globalen Varialben (<-- bin ich eigentlich kein Fan von) arbeiten. 3. Interessanter Gedanke. Das bedeutet aber, dass ich alle Buttons, Labels, usw. mit Source erzeugen und positionieren muss. Fazit: Wird wohl auf Synchronize() und globale Variablen hinauslaufen. |
Re: Formular im Thread erzeugen
Da ist nicht zwingend eine Globale Variable notwendig, evtl. kannst du im Konstruktor des Threads die Form als Parameter mit übergeben oder so?
|
Re: Formular im Thread erzeugen
Zitat:
Sendmessage wäre da allerdings noch einfacher. Denn da kannst du einen Pointer auf einen Record mit deinen Variablen übergeben. Aber Messages sollte man mit Bedacht einsetzen, da sie den Code schnell unleserlich machen. Aber wenn du sie nur dafür verwendest, geht das. |
Re: Formular im Thread erzeugen
Zitat:
Das mit Sendmessage habe ich noch nie probiert. Ist das sicher, dass ein Sendmessage den Thread anhält? Werden Messages in Windows nicht in einer Schleife abgearbeitet (wenn Windows mal wieder Zeit hat). Bisher war ich mir nicht sicher, ob Messages threadsafe sind. |
Re: Formular im Thread erzeugen
Zitat:
Das würde in etwa so aussehen:
Delphi-Quellcode:
Das funktioniert definitiv. Dein Thread steht. Aber wie gesagt: Bei übermässiger Anwendung bekommst du unlesbaren Code und du darfst niemals sendmessage in beide Richtungen verwenden (von beiden Threads aus; es darf immer nur ein Thread sendmessage benutzen)
//Vorraussetzung ist, dass du das Windowhandle eines Fensters im MainThread hast
procedure Threadexecute; var myRecord:TmyRecord antwort:integer; begin ... antwort:=sendmessage(windowhandle,WM_User,integer(@myRecord),0); // anstatt der 0 kann man natürlich noch eine andere Zahl übergeben ... end; //MainThread (z.B. Form1) type TForm1=class(Tform) ... procedure myThreadMessage(var msg:TMessage);message WM_User; end; ... procedure TForm1.myThreadMessage(var msg:TMessage); var myRecord:^TmyRecord; begin myRecord:=pointer(msg.wparam); frmForm1:=TfrmForm1.Create(); try msg.result:=frmForm1.ShowModal; //msg.Result wird als Ergebnis von Sendmessage durchgereicht -->Antwort finally freeandnil(frmForm1); end; end; |
Re: Formular im Thread erzeugen
@ sirius: Thx, du hast recht.
Hab´s gerade auch gegoogelt. SendMessage hält den Thread an, Postmessage macht weiter. |
Re: Formular im Thread erzeugen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 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 by Thomas Breitkreuz