• fics © (08.04.17 21:24) [0]
    Можно ли реилизацию процедуры Execute потока описать в другом классе?
    Лучше поясню на кусочке кода:
    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm1 = class(TForm)
     private
       { Private declarations }
     public
       { Public declarations }
     end;

     TMyThread = class(TThread)
     private

     protected
       procedure Execute; override;
     end;

     TMyClass = class(TObject)
     private
       FMyThread: TMyThread;
       procedure MyExecute;
     public
       constructor Create;
       destructor Destroy; override;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    constructor TMyClass.Create;
    begin
     FMyThread := TMyThread.Create(true);
      FMyThread.Execute := MyExecute; вот так конечно нельзя, но хотелось бы, как-то так
     FMyThread.FreeOnTerminate := True;
     FMyThread.Priority:=tpLower;
     FMyThread.Resume;
    end;

    destructor TMyClass.Destroy;
    begin

    end;

    procedure TMyClass.MyExecute;
    begin

    end;

    end.

  • Rouse_ © (08.04.17 22:08) [1]
    Можно, только зачем?
    Проще уж тогда просто из Execute вызвать нужный тебе метод другого класса.
  • fics © (08.04.17 22:20) [2]

    > Можно, только зачем?

    Просто чтобы знать как.


    > Проще уж тогда просто из Execute вызвать нужный тебе метод
    > другого класса.


    Ну как бы объяснить...  В этот метод передаются (который должен быть в отдельном потоке) в качесве параметров поля этого класса, вот пока только поэтому. А первоначально код писал другой, подход может и не верный (передавать в качестве параметров в свой же метод класса свои же поля) , но этот же метод вызывается и из других классов, где он не вызывается в отдельном потоке
  • Игорь Шевченко © (08.04.17 22:39) [3]
    Можно ли реализацию метода класса описать в другом классе ?
    Нельзя.
  • kilkennycat © (08.04.17 22:44) [4]

    > Игорь Шевченко ©   (08.04.17 22:39) [3]

    разве? а абстрагирование не именно это?
  • NoUser © (09.04.17 01:54) [5]
    > но хотелось бы, как-то так
    uses
     Windows, System.SysUtils, Classes;

    type
    TExec = procedure of object;

    TDyThread = class(TThread)
    private
     fExec :TExec;
     procedure Execute; override; // final;
    public
     procedure Exec(aExec :TExec);
     constructor Create;
    end;

    TMyThread = class(TDyThread)
    public
     property Execute:TExec write Exec;
    end;

    TMyClass = class(TObject)
      procedure MyExecute;
    end;

    { TDummyThread }

    constructor TDyThread.Create;
    begin
    FreeOnTerminate:=True;        // t.Free;
    inherited Create(True);
    end;

    procedure TDyThread.Exec(aExec:TExec);
    begin
    fExec := aExec;
    Suspended := False;
    end;

    procedure TDyThread.Execute;
    begin
    fExec();
    end;

    { TMyClass }

    procedure TMyClass.MyExecute;
    begin
    Sleep(123);
    Free;                         // c.Free;
    end;

    var
    c : TMyClass;
    t : TMyThread;

    begin
    // TMyThread.Create.Execute := TMyClass.Create.MyExecute;  // :))

    c := TMyClass.Create;
    t := TMyThread.Create;

    t.Execute := c.MyExecute;     // Go!

    Sleep(1234);
    end.
  • NoUser © (09.04.17 02:36) [6]
    > в другом классе!
    uses
    System.Threading;      // !!!

    type
    TMyClass = class(TObject)
      procedure MyTask(MyData:TObject);
    end;

    procedure TMyClass.MyTask(MyData: TObject);
    begin
    Sleep(123);
    Free;
    end;

    var
    MyData :TObject;
    begin
    TTask.Run(MyData , TMyClass.Create.MyTask);
    Sleep(1234);
    end.
  • Игорь Шевченко © (09.04.17 10:27) [7]
    NoUser ©   (09.04.17 02:36) [6]

    Это к чему приведено и как относится к вопросу ?
  • fics © (09.04.17 10:45) [8]

    >  c := TMyClass.Create;
    >  t := TMyThread.Create;
    >  
    >  t.Execute := c.MyExecute;     // Go!

    А зачем  так? Что в конструкторе TMyClass нельзя будет

     FThred.Create
     FThred.Execute :=  MyExecute


    Это ж связка при уже созданных объектах
  • NoUser © (09.04.17 13:32) [9]
    > [7]

    Возможно, при такой постановке вопроса как у ТС, ему интересно будет узнать о ещё одном инструменте параллельного (асинхронного) выполнения части своей программы.

    >  [8]

    В конструкторе TMyClass
    FThred.Create                  // ???
    FThred.Execute :=  MyExecute


    эквивалентно
    constructor TMyClass.Create;
    var
    FThread : TMyThread;
    begin
    FThread := TMyThread.Create;
    FThread.Execute := Self.MyExecute;
    end;

    Но если строчка "Execute :=" не самоцель, то класс TMyThread не нужен.
    Достаточно вместо procedure TDyThread.Exec(aExec:TExec) расширить конструктор TDyThread
    constructor TDyThread.Create(aExec :TExec);
    begin
    fExec := aExec;
    FreeOnTerminate := True;
    inherited Create(False);
    end;

    Тогда, например, в конструкторе TMyClass можно будет так
    TDyThread.Create(MyExecute);

  • fics © (09.04.17 18:35) [10]
    спасибо, вроде понятно
Есть новые Нет новых   [118654   +11][b:0][p:0.002]