How can two different TThread descendants share an OnTerminate handler?

I have an application that launches a number of threads to do something. I have a procedure TThreadOnTerminatefor each of the threads that accesses some flow variables to fill the grid with results. (Each thread performs a different task, but the response is always the same, i.e., Success or Failure with the message StringList.)

So, I have a:

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Result := TThread1(Sender).Result;
  AddMessagesToGrid(TThread1(Sender).Messages);
end;

procedure TFormMain.Thread2OnTerminate(Sender: TObject);
begin
  Result := TThread2(Sender).Result;
  AddMessagesToGrid(TThread2(Sender).Messages);
end;

My question is the following. Can I use the "common" procedure OnTerminateto process the results of all my threads, as shown below?

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Result := <Sender Thread>.Result;
  AddMessagesToGrid(<Sender Thread>.Messages);
end;

We are currently using Delphi 2007. Delphi XE will be updated soon (hopefully).

+3
source share
4 answers

, , , , Result .

- .

type
  TBaseThread = class(TThread)
  protected
    function GetResult: Integer; {virtual if you want to}
    function GetMessages: TStrings; {virtual if you want to}
  public
    property Result: Integer read GetResult;
    property Messages: TStrings read GetMessages;

:

procedure TFormMain.Thread1OnTerminate(Sender: TObject);
begin
  Assert(Sender is TBaseThread);
  Result := TBaseThread(Sender).Result;
  AddMessagesToGrid(TBaseThread(Sender).Messages);
end;
+9

. TThread, , OnTerminate:

type
  TYourThread=class(Thread)
  private
    FTag: Integer;
  public
    // Usual constructor, etc.
  published
    property Tag: Integer read FTag write FTag;
  end;

, , :

MyThread := TYourThread.Create(True);
MyThread.Tag := 1;
MyThread.OnTerminate := ThreadTerminate;
MyThread.Resume;

: Delphi , MyThread.Start, MyThread.Resume.)

OnTerminate:

procedure TFormMain.ThreadTerminate(Sender: TObject);
var
  TheThread: TMyThread;
begin
  TheThread := TMyThread(Sender);
  AddMessagesToGrid(TheThread);
end;

AddMessagesToGrid ( OnTerminate ) , :

procedure TFormMain.AddMessagesToGrid(const Thread: TMyThread);
begin
  WhatEverGrid.Cells[0, Thread.Tag] := Format('Thread %d', [Thread.Tag]);
  // Do whatever with the Thread message stringlist.
end;

(, OnTerminate , , Result. , Result - ...)

+1

, OnTerminate , Sender , :

procedure TFormMain.ThreadOnTerminate(Sender: TObject);
begin
  Result := (Sender as TMyBaseThreadClass).Result;
  AddMessagesToGrid((Sender as TMyBaseThreadClass).Messages);
end;
0

InterlockedIncrement InterlockedDecrement, , . , , .

, , .

 procedure OnTerminateThrd(Sender: TObject);  

//in the create section for your thread
   yournewthread.OnTerminate := OnTerminateThrd;

, OnTerminate .

best regards,
Radu

0
source

Source: https://habr.com/ru/post/1789500/


All Articles