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 Form als eigener Thread (https://www.delphipraxis.net/31270-form-als-eigener-thread.html)

day 6. Okt 2004 22:39


Form als eigener Thread
 
Hallo

Ich habe ein Intro welches den Status der Verbindung zum Server anzeigen soll. Jetzt möchte ich es so machen, dass zuerst das Intro gestartet wird und während dem das Intro läuft soll sich mein Client mit dem Server verbinden. Das Intro habe ich als Form realisiert.
Mein Problem ist jetzt, dass wenn ich das Intro vorher starte es bis zum schluss durch läuft und erst dann wird die verbindung zum Server aufgebaut. Ich müsste also das Form als Thread starten.
Wie mache ich das?
Reicht es, wenn ich die Form zusätzlich noch von TThread ableite. Oder hat jemand eine andere Idee?

Dani 6. Okt 2004 23:00

Re: Form als eigener Thread
 
Hi, du könntest auch die Verbindung/Abfrage zum Server in einen Thread packen. Zugriffe auf Forms musst du dann mit Synchronize oder Critical Sections absichern.
(Neu -> Thread-Objekt -> Execute-Methode überschreiben)

Zitat:

Reicht es, wenn ich die Form zusätzlich noch von TThread ableite
Wie würdest du das denn machen? :gruebel:

dizzy 6. Okt 2004 23:02

Re: Form als eigener Thread
 
Zitat:

Zitat von day
Reicht es, wenn ich die Form zusätzlich noch von TThread ableite.

Delphi <> C
=> keine Mehrfachvererbung

supermuckl 6. Okt 2004 23:15

Re: Form als eigener Thread
 
da kommt mir jetzt die frage auf

kann man einen thread erstellen und der erstellt dann wenn er rennt ein form, zeigt es solange an und aktualisiert ne gauge bis er fertig ist mit was auch immer und bevor er terminiert terminiert er noch das form wo er selber created hat ?

oder kann ein thread garnicht VCL visuelle objekte instanziieren ohne kollisionen mit dem hauptform irgendwie ?!

weil das wäre ja dann fast die lösung

Dani 6. Okt 2004 23:38

Re: Form als eigener Thread
 
Welchen Sinn soll es überhaupt haben, ein Form in einem seperaten Thread zu erzeugen? Erzähl doch mal, was genau in diesem Intro passiert.

himitsu 6. Okt 2004 23:58

Re: Form als eigener Thread
 
Lager doch einfach das ganze Zeug für die Verbindung zum Server in einen Thread aus und starte dieses noch vor dem Form?

day 7. Okt 2004 09:29

Re: Form als eigener Thread
 
Hallo

Das Form zeigt einen kleinen Video, der die Verbinung in ein Netz darstellt. Gleichzeitig leuchtet ein Schriftzug "Connect to server" der bei einem erfolgreichen verbindungsaufbau zu
"connected... " ändern soll.

Ja momentan habe ich es schon so, dass ich zuerst die Verbindung zum Server aufbaue und dan erst das Intro laufen lasse. Aber ich wollte es eben einmal anders probieren.


Zitat:

Lager doch einfach das ganze Zeug für die Verbindung zum Server in einen Thread aus und starte dieses noch vor dem Form
Der komplette Verbindungsaufbau habe ich in einem DataModule (welches von TDataModule abgeleitet ist). Kann daher nicht so einfach einen Thread erzeugen

tommie-lie 7. Okt 2004 10:18

Re: Form als eigener Thread
 
Zitat:

Zitat von supermuckl
kann man einen thread erstellen und der erstellt dann wenn er rennt ein form, zeigt es solange an und aktualisiert ne gauge bis er fertig ist mit was auch immer und bevor er terminiert terminiert er noch das form wo er selber created hat ?

oder kann ein thread garnicht VCL visuelle objekte instanziieren ohne kollisionen mit dem hauptform irgendwie ?!

Ob ein VCL-Thread auch visuelle VCL-Komponenten erzeugen kann, weiß ich nicht, die VCL ist verworren genug, da habe ich mich nie mit soetwas auseinandergesetzt.
Aber ein Thread kann auf jeden Fall nonVCL ein Fenster erzeugen und anzeigen.

Aber ich würde trotzdem himitsus Lösung nehmen, normalerweise trennt man nämlich die Arbeit von der Oberfläche, und nicht umgekehrt.

michael.kaufmann 7. Okt 2004 10:43

Re: Form als eigener Thread
 
einem Thread kann man natürlich jegliche Vcl Componenten generieren und auch ansprechen.
aber wie gesagt, ist es nicht sinnvoll das man das Formular in einen Thread auslagert.

tommie-lie 7. Okt 2004 10:49

Re: Form als eigener Thread
 
Zitat:

Zitat von michael.kaufmann
einem Thread kann man natürlich jegliche Vcl Componenten generieren und auch ansprechen.

Naja, so natürlich finde ich das bei der VCL gar nicht. Formulare melden sich ja gerne in der TApplication-Instanz an, da müsste man auf Thread-Safety achten.

michael.kaufmann 7. Okt 2004 11:06

Re: Form als eigener Thread
 
nein eigentlich nicht wenn das formular in einem thread ist und nur in diesem thread bearbeitet wird ist das kein problem. Probleme gibt es nur wenn andere threads das formular ansprechen bzw. eine neue instanz von einem anderen thread erzeugt wird.

jaj die Tapplication da haben sie das problem mit clx und dlls :)

day 7. Okt 2004 11:17

Re: Form als eigener Thread
 
hallo
Das Intro hat im grossen und ganzen keine interaktionen. Deshalb sehe ich da einen kleineren Aufwand das Form als Thread zu erzeugen. Wenn ich hingegen das DataModule als Thread erzeugen würde wäre das ein weit grösserer Aufwand.

Jens Schumann 7. Okt 2004 11:24

Re: Form als eigener Thread
 
Hallo,
wenn ich es richtig verstehe handelt es sich hier um das Splashscreen-Problem.
Erzeuge im Projektquelltext das Formular mit dem Intro vor dem DataModul und
verwende Show anstatt ShowModal.

day 7. Okt 2004 20:38

Re: Form als eigener Thread
 
Hallo

Ich habe eine Lösung. Bin zwar nicht ganz so glücklich aber es läuft. Was haltet ihr davon?
Was würdet ihr verbessern?

Code:
  constructor TMain.create();
  var i : Integer;
  begin

    //Überprüft, dass nur eine Applikation pro PC gestartet wird.
    if ( FindWindow( Nil, PChar( APPLICATION_TITLE )) = 0 ) Then
    begin
      //initCodeSite
      mSys := TSystemFunc.create();
      mSys.InitCodeSite();

      mHasError := False;

      //Applikation initialisieren
      Application.Initialize;
      Application.Title := APPLICATION_TITLE;

      initIntro();
      //mIntro := TIntroThread.Create(False);

      // Kurze Pause damit der User das Intro auch sieht.
      // Processmessage wird benötigt damit die Schrift angezeigt wird.
      for i:= 1 to 100 do
      begin
        Application.ProcessMessages;
        sleep(20);
      end;
      initDataModule();

      if(DM.DCOMConnection.Connected) Then IntroForm.ConnectionLabel.Caption := 'Connected ...';
      Application.ProcessMessages;
      initScreens();

      // Kurze Pause damit der User sieht dass sich der Server verbunden hat.
      // Processmessage wird benötigt damit die Schrift angezeigt wird.
      for i:= 1 to 50 do
      begin
        Application.ProcessMessages;
        sleep(10);
      end;

      // Intro wird Angehalten
      if(not mHasError) Then IntroForm.StopIntro();

      Application.Run;

    end
    else
    begin
      Windows.Beep(500,250);
      MessageDlg( APPLICATION_TITLE + ' is not able to run twice on this PC.', mtError, [mbOK], 0);
    end;
  end;


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