TRenderer = class
public
...
procedure Render; //рендеринг одного кадра
...
procedure TimerTick(uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD); stdcall;
...
end;
Независимый рендеринг.
Код:
Предполагается возможность создания нескольких таких объектов для рендеринга на нескольких окнах.
Пробовал вариант:
Код:
procedure TOGLRenderer.StartRenderingTimer(ms: word);
begin
renderTimerID:=timeSetEvent(ms,1,@self.TimerTick,0,TIME_PERIODIC);
end;
procedure TOGLRenderer.TimerTick(uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD);
begin
self.Render;
end;
begin
renderTimerID:=timeSetEvent(ms,1,@self.TimerTick,0,TIME_PERIODIC);
end;
procedure TOGLRenderer.TimerTick(uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD);
begin
self.Render;
end;
Однако компилятор жалуется на строку
Код:
renderTimerID:=timeSetEvent(ms,1,@self.TimerTick,0,TIME_PERIODIC);
"variable required"
Необходимо, чтобы каждый объект производил независимый рендеринг, но вариант выше по подошел. Как вариант можно сделать TRenderer наследником класса TThread, но не хотелось бы этого.
Может у кого есть какие варианты?
попробруй вместо @self.TimerTick, поставить @TRenderer.TimerTick. интересно что получится...
Когда метод вызывается таймером, то он этого не учитывает и в стэк адрес экземпляра не отправляется.
Но это только гипотеза :)
Сделал по другому: вынес TimerTick из класса, и передаю в него указатель на экземпляр класса.
Код:
procedure TimerTick(uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD); stdcall;
begin
TRenderer(pointer(dwUser)).Render;
end;
procedure TRenderer.StartRenderingTimer(ms: word);
begin
renderTimerID:=timeSetEvent(ms,1,
@TimerTick,
DWORD(self),
TIME_PERIODIC);
end;
begin
TRenderer(pointer(dwUser)).Render;
end;
procedure TRenderer.StartRenderingTimer(ms: word);
begin
renderTimerID:=timeSetEvent(ms,1,
@TimerTick,
DWORD(self),
TIME_PERIODIC);
end;
Но может еще у кого какие варианты на этот счет есть? А то как-то некрасиво вышло.
Код:
procedure TRenderer.TimerTick(Self: TRenderer; uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD); stdcall;
что не совсем соответствует определению типа callback функции для timeSetEvent.
Насчет красивости - все нормально, поскольку ты выбрал самый оптимальный в данном случае метод передачи указателя на класс в системную callback функцию.
Единственное, что можно еще сделать - это объявить TimerTick как статический метод класса (в этом случае сигнатура параметров не изменится), чтобы, например получить из него доступ к методу Render, если он описан как private или protected. Но это имеет смысл только для C++, поскольку в Delphi все члены класса являются public в пределах модуля, в котором описан класс (если не использовать strict). Так что все нормально и так ;)
Ок. Пожалуй так как есть сейчас вполне удовлетворяет нуждам. Всем спасибо.