![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ли при создании потока(нити) передать в него функцию
v-o-y-a-g-e-r © (2002-12-09 13:42:00)Возможно ли при создании потока(нити) передать в него функцию что бы она выполнилась ?
Ситуация : есть класс с методами. Некоторые методы выполняют расчеты и очень тормозят систему.
Требуется сделать что то типа шаблона нити чтобы любой метод можно было передать в него при ее создании и он мог выполниться в отдельном потоке.
v-o-y-a-g-e-r (2002-12-09 15:34:00) [21]проще...
надо описать вызов функций и процедур к примеру :
function q ( ll : Integer ; ii : Integer ; S1 : Boolean ; S2 : Boolean ): Double ;
procedure SetTransferValue ( iType : Integer ;
iDevGroup1 : Integer ;
iDevGroup2 : Integer ;
Value : Double ) ;
function ShowTransfer ( iType : Integer ; Grid : TStringGrid ):Boolean ;
procedure ShowGroup ( iType : Integer ; StringGrid : TStringGrid );
надо создавать overload ...иначе конструктор нити не понимает параметров ?
v-o-y-a-g-e-r (2002-12-09 15:30:00) [22]Vas, для меня не важно какой метод вызывался для меня важен просто результат вызова - число и по этому ID не так актуальны..., единственное что я вижу... сделать переменную , которую может эта callback функция просто апдейтить....?
Еще вопросик ... все функции подлежат обязательной типизации для вызова или можно так :
TObjFunc = function : variant of object;
VaS (2002-12-09 15:09:00) [23]Можно по завершении вызывать callback-функцию объекта, тоже передаваемую в нить. В эту функцию передавать результат выполнения метода и нек. ID выполненного метода (который тоже передается в нить). А уж эта callback-функция обрабатывает результат на основе ID.
Я делал все это немного иначе - завел в классе thread-safe очередь, куда помещал ID _операций_, которые нужно выполнить (напр. opAddNewRecords - указание выполнить метод AddNewRec и т.д.). Далее в постоянно живущей глобальной нити разбирал очереди объектов и выполнял соответствующие методы.
v-o-y-a-g-e-r (2002-12-09 14:41:00) [24]Vas, спасибо, я так уже успел поробовать...загвоздка встала в методах возвращающих результат - функциях...с процедурами все вроде бы пашет, но не знаю как выдрать возвращаемое функцией значение ... мож объяснишь..
VaS (2002-12-09 14:29:00) [25]
type
TForm1 = class(TForm)
...
public
procedure DoWork;
end;
TObjProc = procedure of object;
TTr = class(TThread)
private
FProc: TObjProc;
procedure DoProc;
protected
procedure Execute; override;
public
constructor Create(Proc: TObjProc);
end;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
TTr.Create(DoWork);
end;
constructor TTr.Create(Proc: TObjProc);
begin
inherited Create(true);
FProc:=Proc;
FreeOnTerminate:=true;
Resume;
end;
procedure TTr.DoProc;
begin
if Assigned(FProc) then
FProc;
end;
procedure TTr.Execute;
begin
Synchronize(DoProc);
end;
procedure TForm1.DoWork;
begin
Label1.Caption:=IntToStr(GetTickCount);
end;
Методы должны быть одного типа. Ну и synchronize() можно убрать, если методы не обращаются к интерфейсу.
Digitman (2002-12-09 14:27:00) [26]см. TMethod
Polevi (2002-12-09 14:21:00) [27]адрес передай