![]() |
AW: Form in neuem Thread laufen lassen
Zitat:
Nun zur eigentlichen Frage, ich habe die folgende Messagequeue mit IsDialogMessage, TranslateMessage u. DispatchMessage für den eigenständigen Nonvcl Thread mit:
Delphi-Quellcode:
überhaupt richtig gemacht, oder würdet ihr es anders lösen? oder anders gefragt, braucht man die überhaupt? :gruebel:
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; lg, jus |
AW: Form in neuem Thread laufen lassen
Zitat:
Delphi-Quellcode:
notwendig? Glaube das kannst du weglassen.
IsDialogMessage
|
AW: Form in neuem Thread laufen lassen
Die Methode TThread.Create(...) rufts du ja im Hauptthread auf. Wo soll das Fenster also anders "laufen" als im Hauptthread?
|
AW: Form in neuem Thread laufen lassen
Zitat:
|
AW: Form in neuem Thread laufen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
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:
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.
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; |
AW: Form in neuem Thread laufen lassen
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. |
AW: Form in neuem Thread laufen lassen
Zitat:
Zitat:
lg, jus |
AW: Form in neuem Thread laufen lassen
Zitat:
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ß. |
AW: Form in neuem Thread laufen lassen
Code:
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.
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ß.
Wir benutzen diesen Ansatz eigentlich immer. Funktioniert auch in mixed Umgebungen (Delphi VC++) etc sehr gut. |
AW: Form in neuem Thread laufen lassen
Zitat:
Delphi-Quellcode:
Ist doch total simpel?
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; Einfach im Thread die entsprechend gewünschten Windowsfunktionen aufrufen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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