Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ExitCode von GetExitCodeThread in TThread setzen? (https://www.delphipraxis.net/201570-exitcode-von-getexitcodethread-tthread-setzen.html)

jus 2. Aug 2019 10:28


ExitCode von GetExitCodeThread in TThread setzen?
 
Hallo,

ich möchte gern den ExitCode von einem Thread mit WinAPI GetExitCodeThread nach dem Beenden auslesen. Doch ich finde keine Möglichkeit den ExitCode in TThread zu setzen. Gibt es da eine Möglichkeit dies zu machen, wenn ich den Thread über Delphiklasse TThread erzeuge?

lg,
jus

Der schöne Günther 2. Aug 2019 10:51

AW: ExitCode von GetExitCodeThread in TThread setzen?
 
In der Delphi-RTL heißt es
Delphi-Quellcode:
TThread.ReturnValue
und ist aus unerfindlichen Gründen ein Integer aber...

Delphi-Quellcode:
program Project1;

uses
   System.SysUtils,
   System.Classes,
   WinApi.Windows;

procedure p();
var
   thread: TThread;
   threadExitCode: DWORD;
begin
   thread := TThread.CreateAnonymousThread(
      procedure()
      begin
         TThread.SetReturnValue(42);
      end
   );
   thread.FreeOnTerminate := False;
   thread.Start();
   thread.WaitFor();

   Win32Check(
      WinApi.Windows.GetExitCodeThread(thread.Handle, threadExitCode)
   );
   WriteLn('Exit code: ', threadExitCode);
end;

begin
   try
      p();
   except
      on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
   end;
   ReadLn;
end.

jus 3. Aug 2019 00:30

AW: ExitCode von GetExitCodeThread in TThread setzen?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1438981)
In der Delphi-RTL heißt es
Delphi-Quellcode:
TThread.ReturnValue
und ist aus unerfindlichen Gründen ein Integer aber...

Delphi-Quellcode:
program Project1;

uses
   System.SysUtils,
   System.Classes,
   WinApi.Windows;

procedure p();
var
   thread: TThread;
   threadExitCode: DWORD;
begin
   thread := TThread.CreateAnonymousThread(
      procedure()
      begin
         TThread.SetReturnValue(42);
      end
   );
   thread.FreeOnTerminate := False;
   thread.Start();
   thread.WaitFor();

   Win32Check(
      WinApi.Windows.GetExitCodeThread(thread.Handle, threadExitCode)
   );
   WriteLn('Exit code: ', threadExitCode);
end;

begin
   try
      p();
   except
      on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
   end;
   ReadLn;
end.

Ah ok, vielen Dank für das Beispiel. Ich hatte bei mir einen Denkfehler drin.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  ExitCode: DWORD;
  ThreadHandle: THandle;
begin
  if TestThread <> NIL then
  begin
    ThreadHandle := TestThread.Handle;
    TestThread.Terminate;
    TestThread.WaitFor;
    FreeAndNil(TestThread);
    GetExitCodeThread(ThreadHandle, ExitCode);
  end;
end;
Und zwar habe ich den GetExitCodeThread erst nach dem Thread.Free gemacht, da ich geglaubt hatte, dass GetExitCodeThread auch nach einem Thread.Free funktionieren würde. Somit gab es das Thread.Handle garnicht mehr und ExitCode war immer Null. :duck:

Wieder mal was gelernt. Vielen Dank! :thumb:

lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 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