AGB  ·  Datenschutz  ·  Impressum  







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

Form in neuem Thread laufen lassen

Ein Thema von Hobbycoder · begonnen am 17. Apr 2017 · letzter Beitrag vom 27. Jul 2017
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    
jus

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

AW: Form in neuem Thread laufen lassen

  Alt 23. Apr 2017, 23:42
Erzeuge alles im execute, das create ist noch im hauptthread, du musst das Window in dem Tread erzeugen in dem es benutzt werden soll.
@Fritzew: Tatsächlich, habe den Createdialog ins Execute verschoben und schon reagiert das Fenster unabhängig von der Auslastung vom Hauptthread. Bin beeindruckt, habe nicht gewußt, dass anscheinend TThread.Create noch im Hauptthread läuft. Vielen Dank für dem essentiellen Hinweis!

Nun zur eigentlichen Frage, ich habe die folgende Messagequeue mit IsDialogMessage, TranslateMessage u. DispatchMessage für den eigenständigen Nonvcl Thread mit:
Delphi-Quellcode:
procedure TDataThread.Execute;
var
  Msg: TMsg;
begin
  hdlg := CreateDialog(HInstance, MAKEINTRESOURCE(100), Self.Handle, @DlgFunc);
  ShowWindow(hdlg, SW_SHOW);
  while not terminated do
  begin
    if GetMessage(msg,0,0,0) then
    begin
      if not(IsDialogMessage(hdlg, Msg)) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
  end;
end;
überhaupt richtig gemacht, oder würdet ihr es anders lösen? oder anders gefragt, braucht man die überhaupt?

lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#32

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 01:09
braucht man die überhaupt?
Ja, die brauchst du in jedem Falle. Aber ist das IsDialogMessage notwendig? Glaube das kannst du weglassen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#33

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 02:44
Die Methode TThread.Create(...) rufts du ja im Hauptthread auf. Wo soll das Fenster also anders "laufen" als im Hauptthread?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#34

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 08:34
Die Methode TThread.Create(...) rufts du ja im Hauptthread auf. Wo soll das Fenster also anders "laufen" als im Hauptthread?
Was heißt das jetzt?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#35

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 08:49
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.
Angehängte Dateien
Dateityp: 7z MultithreadedWindowsTest.7z (618,7 KB, 17x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#36

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 08:55
Achso. Jetzt habe ich den Kommentar von Luckie verstanden.

Die Methode Create läuft noch im Hauptthread, wohingegen die Methode Execute breites im Thread läuft.
  Mit Zitat antworten Zitat
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
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#38

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 13:26
Im Anhang mal die Demo... (das Hauptfenster ist VCL, die Threadfenster nicht)
Hallo Sebastian, danke, das sieht interessant aus!

Was mich nur wundert, ist, daß bei jeder Erzeugung eines neuen Threadfensters der Threadzähler im Taskmanager um 2 inkrementiert wird.

Ganz fein wären Thread-Showmessages, und dann sogar zwei Arten davon: Ein blockierendes und ein nichtblockierendes. Input- und Messageboxen wären auch nicht schlecht. Aber ich bin ein wenig unverschämt, ich weiß...es sind nur Anregungen, die aufzeigen, auf was für Fensterfunktionalität - neben den "normalen" Formularen - in Threads (bisher?) so alles verzichtet werden muß.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#39

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 13:56
Code:
Ganz fein wären Thread-Showmessages, und dann sogar zwei Arten davon: Ein blockierendes und ein nichtblockierendes. Input- und Messageboxen wären auch nicht schlecht. Aber ich bin ein wenig unverschämt, ich weiß...es sind nur Anregungen, die aufzeigen, auf was für Fensterfunktionalität - neben den "normalen" Formularen - in Threads (bisher?) so alles verzichtet werden muß.
Ein anderer Ansatz wäre die VCL-Forms in eine Dll zu legen. Ohne Packages! Die Dll kann dann in einen Thread geladen werden. Man spart sich den den NonVcl Kram und kann seine Formulare ganz normal designen.
Wir benutzen diesen Ansatz eigentlich immer. Funktioniert auch in mixed Umgebungen (Delphi VC++) etc sehr gut.
Fritz Westermann
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#40

AW: Form in neuem Thread laufen lassen

  Alt 24. Apr 2017, 14:01
Ganz fein wären Thread-Showmessages, und dann sogar zwei Arten davon: Ein blockierendes und ein nichtblockierendes. Input- und Messageboxen wären auch nicht schlecht. Aber ich bin ein wenig unverschämt, ich weiß...es sind nur Anregungen, die aufzeigen, auf was für Fensterfunktionalität - neben den "normalen" Formularen - in Threads (bisher?) so alles verzichtet werden muß.
Delphi-Quellcode:
procedure ShowMessageThreaded(const Msg: string; const TitleCaption: string = '');
begin
  TThread.CreateAnonymousThread(
    procedure
    begin
      Winapi.Windows.MessageBox(0, PChar(Msg), PChar(TitleCaption), 0);
    end
    ).Start;
end;


procedure TForm2.FormCreate(Sender: TObject);
begin
  ShowMessageThreaded('Hello');
end;
Ist doch total simpel?
Einfach im Thread die entsprechend gewünschten Windowsfunktionen aufrufen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    


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 01:59 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