Статический метод класса
внутри одного метода класса в функцию CreateThread нужно передать адрес другого метода того же класса. делаю так:
Код:
hThread := CreateThread(nil,0, @ListenThreadProc, @self, 0, iListenThreadID);
выдает ошибку Variable required...
В С++ это делается просто - метод ListenThreadProc объявляется как static и все... как это реализовать в Делфи?
Код:
TMyClass = class
class procedure MyClassProc;
end;
class procedure MyClassProc;
end;
Передать в процедуру CreateThread указатель на таким образом созданную процедуру не прокатит, поскольку ListenThreadProc имеет жестко заданный список параметров:
Код:
procedure ListenThreadProc(lpParameter: Pointer);
Если ты объявишь ее как классовый метод, то получишь уже немного другое:
Код:
procedure ListenThreadProc(Self: class of TMyClass; lpParameter: Pointer);
Дело в том, что дельфи сам создает неявный параметр Self даже у классовых методов (в отличие от экземплярных методов, он содержит ссылку на сам класс). Соответственно, использовать его в CreateThread нельзя.
Можно это обойти с помощью еще одной процедуры:
Код:
type
TMyClass = class
class procedure ListenProcedure(lpParameter: TMyClass);
end;
procedure ListenThreadProc(lpParameter: Pointer); stdcall;
var Self: TMyClass;
begin
Self:=TMyClass(lpParameter);
Self.ListenProcedure(Self);
end;
TMyClass = class
class procedure ListenProcedure(lpParameter: TMyClass);
end;
procedure ListenThreadProc(lpParameter: Pointer); stdcall;
var Self: TMyClass;
begin
Self:=TMyClass(lpParameter);
Self.ListenProcedure(Self);
end;
Хотя в данном случае, думаю, классовый метод и не нужен вовсе...
ЗЫ: Данный код надо проверить - писал с ходе, дельфы под рукой нет :)