Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Formular im Thread erzeugen (https://www.delphipraxis.net/103396-formular-im-thread-erzeugen.html)

Eurowig 15. Nov 2007 09:52


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:
procedure ThreadExecute(...);
begin
  ... verarbeite Daten
  if LogfileVoll then
  begin
    frmForm1 : TfrmForm1.Create();
    frmForm1.ShowModal; --> im OnShow von frmForm1 'Thread.Wait'
    Thread.Resume;
  end;
end;
Nun geht das ja bekanntlich nicht, da die VCL nicht threadsicher ist.
Wie kann ich also während ein Thread läuft, diesen anhalten und ein Formular für eine Benutzereingage anzeigen???

Gruß
Christian

marabu 15. Nov 2007 10:03

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

sirius 15. Nov 2007 10:07

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)

Eurowig 15. Nov 2007 10:16

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.

Tormentor32 15. Nov 2007 10:25

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?

sirius 15. Nov 2007 10:26

Re: Formular im Thread erzeugen
 
Zitat:

Zitat von Eurowig
Fazit: Wird wohl auf Synchronize() und globale Variablen hinauslaufen.

Wieso globale Variablen? Du benutzt doch TThread, oder? Da kannst du doch die Variablen in deiner TThread-Insatnz haben.

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.

Eurowig 15. Nov 2007 10:41

Re: Formular im Thread erzeugen
 
Zitat:

Zitat von sirius
Wieso globale Variablen? Du benutzt doch TThread, oder? Da kannst du doch die Variablen in deiner TThread-Insatnz haben.

Das könnte gehen. Muss ich die TThread Instanz halt selber schreiben. Mom. verwende ich gerade eine Threadcomponente aus der JEDI VCL.

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.

sirius 15. Nov 2007 11:00

Re: Formular im Thread erzeugen
 
Zitat:

The SendMessage function sends the specified message to a window or windows. The function calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessage function, in contrast, posts a message to a thread's message queue and returns immediately.

Das würde in etwa so aussehen:
Delphi-Quellcode:
//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;
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)

Eurowig 15. Nov 2007 11:05

Re: Formular im Thread erzeugen
 
@ sirius: Thx, du hast recht.
Hab´s gerade auch gegoogelt. SendMessage hält den Thread an, Postmessage macht weiter.

RavenIV 15. Nov 2007 11:11

Re: Formular im Thread erzeugen
 
Zitat:

Zitat von Eurowig
@ sirius: Thx, du hast recht.
Hab´s gerade auch gegoogelt. SendMessage hält den Thread an, Postmessage macht weiter.

Hättest Du in der MSDN auch gefunden. Vermutlich schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Seite 1 von 2  1 2      

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