Announcement

Collapse
No announcement yet.

Form in Thread

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Form in Thread

    Hi,

    ich hab ein Programm zum Auswerten von Dateien. Da diese Dateien nicht vollständig automatisch ausgewertet werden können, programmiere ich gerade einen Editor der dem Benutzer die manuelle Verarbeitung der Dateien soweit wie möglich erleichtern soll. Diese Editor-Fenster werden von dem Hauptprogramm (die Auswertung) aus aufgerufen und sind <B>keine</B> eigenständigen Programme!! Allerdings werden innerhalb dieses Editors relativ zeitaufwendige Funktionen zu Verarbeitung dieser Dateien aufgerufen, die dann den Ablauf des gesamten Programms behindern würden, also auch die Arbeit mit einem paralell geöffneten Editor. Ich habe mir daher überlegt jedes Editor-Fenster in einen eigenen Thread zu legen, und nicht nur die verschiedenen Funktionen.<BR>
    Nur wie stell ich das an, dass die gesamte Form innerhalb von diesem Thread abläuft und der Thread erst treminiert, sobald die Form geschloßen wird?

    Danke, Motzi

  • #2
    Hallo,

    das ist keine gute Idee, da alle Zugriffe auf die VCL, die irgend ein Fensterhandle betreffen, aus dem primären Thread des Programms heraus erfolgen müssen. Dies ist auch der Grund für die TThread-Methode <b>Synchronize</b>. Microsoft schreibt vor, dass alle GUI-Zugriffe einen Threadbezug haben, da zum Beispiel ein Fenster-Handle nur in dem Thread gültig ist, in dem dieses Fenster erzeugt wurde. Man müsste also auf die VCL verzichten und im klassischen Win32-API-Stil (CreateWindwos etc.) programmieren.<br>
    Es muss also nur die zeitaufwendige Funktion in den Thread ausgelagert werden, aber alle GUI-Aktivitäten über den primären Thread (VCL-Thread) abgewickelt werden

    Comment


    • #3
      Hi,

      Es gibt also keine Möglichkeit ein Fenster in einem eigenen Thread laufen zu lassen.. es wäre aber trotzdem sehr wünschenswert, wenn die komplette Arbeit in diesem Editor in einem eigenen Thread laufen würde.. (also im Prinzip dasselbe wie wenn der Editor eine eigene Applikation wäre, aber ich will eben alles in einem Prog haben!) Gibt es keine andere Möglichkeit als wirklich für jede Aktion einen eigenen Thread zu schreiben?

      Danke, Motzi

      PS: Es werden keine Variablen vom primären Thread und dem Editor-Thread gemeinsam benutzt

      Comment


      • #4
        Hallo,

        wenn <b>CreateWindow</b> im separaten Thread aufgerufen wird und dieser auch eine eigene <i>Message Loop</i> (Botschaftsbehandlungs-Schleife) implementiert, kann man das im Thread machen. Leider bedeuten diese Einschränkungen auch, dass als "Nebenwirkung" die VCL nicht verwendet werden darf. Es stellt sich also schlicht und einfach die Frage, welcher Weg den geringsten Aufwand bedeutet

        Comment


        • #5
          Nach diesem Schema funktioniert es nicht?

          TMyThread = class(TThread)
          ....
          FForm: TEditorThread;
          ....

          procedure TThread.Execute;
          begin
          FForm := TEditorForm.Create;
          ...; // Falls es so funktionieren sollte/könnte.. Was gehört da rein?
          FForm.Free;
          end;

          Die gesamte Form wird <B>nur</B> innerhalb des Threads benutzt. Von
          außen wird nur der Thread erzeugt.. mehr nicht!

          Danke, Motz

          Comment


          • #6
            Nach diesem Schema funktioniert es nicht?

            TMyThread = class(TThread)<BR>
            ....<BR>
            FForm: TEditorThread;<BR>
            ....

            procedure TThread.Execute;<BR>
            begin<BR>
            FForm := TEditorForm.Create;<BR>
            ...; // Falls es so funktionieren sollte/könnte.. Was gehört da
            rein?<BR>
            FForm.Free;<BR>
            end;

            Die gesamte Form wird <B>nur</B> innerhalb des Threads benutzt. Von
            außen wird nur der Thread erzeugt.. mehr nicht!

            Danke, Motz

            Comment


            • #7
              Hi

              Es geht nicht darum was von AUSSEN auf das EditorForm zugreift, sondern eher darum worauf das EditorForm innerhelb des Threads NACH AUSSEN zugreift. D.h. selbst wenn NICHTS von aussen auf das EditorForm zugreift, so greift aber intern die VCL IMMER auf durch alle Thread gemeinsam genutzte Objecte zu. Diese sind aber NICHT Threadsave.

              Beispiel: Zu einem Editor gehört eine Druckfunktion. Normalerweise wird das TPrinter Object bemüht. Nun, was passiert wenn zwei Deiner EditorForms zur gleichen Zeit in parallel dieses Object ansprechen ?!

              Weiter: Damit ein TForm überhaupt geladen werden kann (als DFM Resource) benötigt Delphi bestimmte Informationen. All diese Infos sind in GLOBALEN, nicht threadsicheren, Variablen/Listen etc. gespeichert. Werden zwei Editoren gleichzeitig geöffnet kommts zum Abkack.

              Jedes spezielle Control Handling, wie Fenstercallbacks einrichten um die Window fenster in Delphi conforme Form zu bringen, das komplette TScreen und TApplication Handling, inclusive Hints, Mauskursor usw. usw. usw ist NICHT threadsave.

              Gruß Hage

              Comment


              • #8
                Nagut.. dann halt nicht
                Aber trotzdem danke für die Antworten!

                Motz

                Comment


                • #9
                  Hallo,<br>
                  wie sieht es denn mit einem Datenmodul in einem neuen Thread aus?<br><br>
                  Ich habe ein Formular mit Anzeige und ein bissl Datenverarbeitung in extra Unit (noch kein Thread). Da ich aber staendig an einem Port im PC lauschen muss will ich die Komponente fuer den Portzugriff auf ein Datenmodul abschieben und als Thread parallel zum Form laufen lassen und bei Datenankunft einfach die Daten ans Form Weiterreichen. Waere das moeglich?<br>THX

                  Comment

                  Working...
                  X