AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular im Thread erzeugen

Ein Thema von Eurowig · begonnen am 15. Nov 2007 · letzter Beitrag vom 15. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Eurowig
(Gast)

n/a Beiträge
 
#1

Formular im Thread erzeugen

  Alt 15. Nov 2007, 10:52
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:03
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:07
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#4

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:16
@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.
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:25
Da ist nicht zwingend eine Globale Variable notwendig, evtl. kannst du im Konstruktor des Threads die Form als Parameter mit übergeben oder so?
Richard Mahr
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:26
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#7

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 11:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 12:00
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Eurowig
(Gast)

n/a Beiträge
 
#9

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 12:05
@ sirius: Thx, du hast recht.
Hab´s gerade auch gegoogelt. SendMessage hält den Thread an, Postmessage macht weiter.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Formular im Thread erzeugen

  Alt 15. Nov 2007, 12:11
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.
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