Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Независимый рендеринг.

7.0K
01 июля 2008 года
Rusd
88 / / 26.08.2006
есть объект типа
 
Код:
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;

Однако компилятор жалуется на строку
 
Код:
renderTimerID:=timeSetEvent(ms,1,@self.TimerTick,0,TIME_PERIODIC);

"variable required"
Необходимо, чтобы каждый объект производил независимый рендеринг, но вариант выше по подошел. Как вариант можно сделать TRenderer наследником класса TThread, но не хотелось бы этого.
Может у кого есть какие варианты?
261
01 июля 2008 года
ahilles
1.5K / / 03.11.2005
попробруй вместо @self.TimerTick, поставить @TRenderer.TimerTick. интересно что получится...
7.0K
01 июля 2008 года
Rusd
88 / / 26.08.2006
Попробовал. Вылетает с ошибкой обращения к памяти. Полагаю, что при вызове метода класса ему еще передается адрес экземпляра. И когда вызывается метод, то он берет из стэка этот адрес.
Когда метод вызывается таймером, то он этого не учитывает и в стэк адрес экземпляра не отправляется.
Но это только гипотеза :)
Сделал по другому: вынес 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;


Но может еще у кого какие варианты на этот счет есть? А то как-то некрасиво вышло.
303
01 июля 2008 года
makbeth
1.0K / / 25.11.2004
Ну почему же гипотеза? Именно из-за неявного дополнительного параметра и происходит ошибка. На самом деле TimerTick выглядит так:
 
Код:
procedure TRenderer.TimerTick(Self: TRenderer; uTimerID, uMessage: UINT; dwUser, dwl,dw2: DWORD); stdcall;

что не совсем соответствует определению типа callback функции для timeSetEvent.
Насчет красивости - все нормально, поскольку ты выбрал самый оптимальный в данном случае метод передачи указателя на класс в системную callback функцию.
Единственное, что можно еще сделать - это объявить TimerTick как статический метод класса (в этом случае сигнатура параметров не изменится), чтобы, например получить из него доступ к методу Render, если он описан как private или protected. Но это имеет смысл только для C++, поскольку в Delphi все члены класса являются public в пределах модуля, в котором описан класс (если не использовать strict). Так что все нормально и так ;)
7.0K
02 июля 2008 года
Rusd
88 / / 26.08.2006
Ок. Пожалуй так как есть сейчас вполне удовлетворяет нуждам. Всем спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог