Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возможно ли при создании потока(нити) передать в него функцию


Страницы:   1 2

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]

адрес передай


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо