Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#37

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 12:09
Die Methode TThread.Create(...) rufts du ja im Hauptthread auf. Wo soll das Fenster also anders "laufen" als im Hauptthread?
@Luckie: Yup, klingt natürlich logisch, ich war aber bisher der falschen Meinung, dass es bereits schon im Thread läuft.

Wenn du zum Beispiel eine Methode Test hättest und diese aufrufst, würdest du ja auch nicht erwarten, dass diese in einem anderen Thread läuft. TThread.Create ist auch nur eine normale Methode, die als Konstruktor fungiert. Dementsprechend wird diese auch im Hauptthread bleiben und ausgeführt werden, wenn du diese im Hauptthread aufrufst.

Execute rufst du nicht selbst auf, sondern wird intern aus dem neuen Thread heraus aufgerufen. Deshalb ist das nicht mehr im Kontext des Hauptthreads.

Übrigens siehst du in der Liste der Threads im Debugger auch in welchem du dich gerade befindest, wenn du gerade debuggst.

Ich werde dann einmal ein Repository vorbereiten und die Units dort zur Verfügung stellen inkl. Demo. Im Anhang mal die Demo... (das Hauptfenster ist VCL, die Threadfenster nicht)
Deren Quelltext sieht so aus:
Delphi-Quellcode:
  TThread.CreateAnonymousThread(procedure
    var
      ExampleDialog: TNonVclDialog;
      ExampleControl: TNonVclEdit;
      i, j: Integer;
    begin
      TThread.NameThreadForDebugging('Testtext');
      ExampleDialog := TNonVclDialog.Create(1901);
      try
        ExampleDialog.Show;
        ExampleControl := ExampleDialog.Get<TNonVclEdit>(4001);
        ExampleDialog.Get<TNonVclButton>(IDOK).OnClick := DialogButtonClick;
        for i := 0 to 10 do
        begin
          for j := 0 to 10 do
          begin
            ExampleControl.Text := ExampleControl.Text + 'abc';
            Sleep(100);
          end;
          ExampleControl.Text := ExampleControl.Text + 'abc'#13#10;
        end;
      finally
        ExampleDialog.Free;
      end;
    end).Start;
Beim Beenden knallt die Demo, wenn noch Threadfenster offen sind. Das liegt daran, dass ich aktuell die Threads vor dem Beenden nicht beende, das werde ich noch sauber machen.
@jaenicke: auf den Code bin ich schon sehr gespannt, vielen Dank mal im Voraus!

lg,
jus
  Mit Zitat antworten Zitat