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