-
Можно ли реилизацию процедуры Execute потока описать в другом классе? Лучше поясню на кусочке кода: unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
public
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
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.
-
Можно, только зачем? Проще уж тогда просто из Execute вызвать нужный тебе метод другого класса.
-
> Можно, только зачем?
Просто чтобы знать как.
> Проще уж тогда просто из Execute вызвать нужный тебе метод > другого класса.
Ну как бы объяснить... В этот метод передаются (который должен быть в отдельном потоке) в качесве параметров поля этого класса, вот пока только поэтому. А первоначально код писал другой, подход может и не верный (передавать в качестве параметров в свой же метод класса свои же поля) , но этот же метод вызывается и из других классов, где он не вызывается в отдельном потоке
-
Можно ли реализацию метода класса описать в другом классе ? Нельзя.
-
> Игорь Шевченко © (08.04.17 22:39) [3]
разве? а абстрагирование не именно это?
-
> но хотелось бы, как-то так
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.
-
> в другом классе!
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.
-
NoUser © (09.04.17 02:36) [6]
Это к чему приведено и как относится к вопросу ?
-
> c := TMyClass.Create; > t := TMyThread.Create; > > t.Execute := c.MyExecute; // Go!
А зачем так? Что в конструкторе TMyClass нельзя будет
FThred.Create
FThred.Execute := MyExecute
Это ж связка при уже созданных объектах
-
> [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);
-
спасибо, вроде понятно
|