Использование TTImer в приложении без окон

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Использование TTImer в приложении без окон

Eugie » 26 мар 2004, 16:35

Incompatible types: method pointer and regular procedure"


Это ошибка даже не связанная с наличием или отсутствием окон. Это ошибка на этапе компиляции.
OnTimer имеет тип procedure of object (т.е. МЕТОД) это совсем не то, что указатель на процедуру.
Совершенно верно, забыл сказать самое главное :) Собственно, весь пафос был посвящен невозможности использовать TTimer в программе без очереди сообщений.

delphi-coder, еще раз обращаю внимание: либо TTimer - и тогда нужно использовать Forms и всю архитектуру, заложенную в TApplication, либо придется искать другие варианты (см.выше)

delphi-coder » 26 мар 2004, 13:17

Для Timer.OnTimer получилось назначить нужную процедуру, когда я сделал её методом класса:

Код: Выделить всё

type
 timerevent = class(TObject)
 	Public
        procedure MTTimer(Sender: TObject);
        procedure QRTimer(Sender: TObject);
        procedure saverTimer(Sender: TObject);
 end;

procedure timerevent.savertimer(Sender: TObject);
begin
lalala
end;

procedure timerevent.MTTimer(Sender: TObject);
lalala

procedure timerevent.QRTimer(Sender: TObject);
lalala

//Main
var
 tmev: timerevent;
 job, saver: TTimer;

tmev := timerevent.Create;

job := TTimer.Create(nil);
If lowercase(ddesrv) = 'mt' then job.OnTimer := tmev.MTTimer;
If lowercase(ddesrv) = 'qr' then job.OnTimer := tmev.QRTimer;

saver := TTimer.Create(nil);
saver.OnTimer := tmev.saverTimer;

While (True) do
	begin
        Application.ProcessMessages;
        sleep(1000);
        end;
Этот код нормально работает, таймеры тоже работают. Но раздражает этот бесконечный цикл While (True) do, да и вызывать Application.ProcessMessages; не хочется - приходится использовать Forms, а это прибавляет размера файлу, да и зачем мне в ресурсах иконки\курсоры\т.д., если у меня даже окна нету?! Можно ли это как-нибудь по-другому реализовать?

Naeel Maqsudov » 26 мар 2004, 08:35

Incompatible types: method pointer and regular procedure"
Это ошибка даже не связанная с наличием или отсутствием окон. Это ошибка на этапе компиляции.
OnTimer имеет тип procedure of object (т.е. МЕТОД) это совсем не то, что указатель на процедуру.

Код: Выделить всё


procedure TSomeObject.jobTimer;
begin
{some code here}
end;

...
job.OnTimer := SomeObject1.jobTimer;

//разумеется SomeObject1 должен быть типа TSomeObject и быть инициализирован (Created)

Не могу сейчас поглядеть исходники TTimer, чтобы сказать что-то более определенное, но попробуйте, должно получиться.

ЗЫ.
Обязательно напишите.

Eugie » 24 мар 2004, 19:07

Если у твоего приложение нет message loop, то обычный таймер работать вообще не будет. Дело в том, что TTimer - это просто дельфовая обертка для API-шного таймера, а он предполагает наличие очереди сообщений. Более того, TTimer реализует API-таймер, непосредственно связанный с окном (см.TTimer.Create).

Короче, здесь нужен другой вариант. Может, имеет смысл сделать свой таймер. Не знаю, как там в Линукс, но в Винде я бы использовал QueryPerformanceCounter в отдельном потоке. Опять же, в Винде есть еще несколько таймер-объектов, типа waitable timer (см. CreateWaitableTimer,...) и timer-queue timer (см. CreateTimerQueue,...), но здесь ничем помочь не могу - сам не юзал :)

Использование TTImer в приложении без окон

delphi-coder » 23 мар 2004, 21:11

Проблема в следующем: создаю приложение-демон (без окон, сходно с консольным приложением). В нём нужно использовать таймер. Делаю так:

Код: Выделить всё

var
 job: TTimer;

procedure jobTimer;
begin
{some code here}
end;

begin
job := TTimer.Create(nil);
job.Interval := 1000;
job.OnTimer := jobTimer;
end;
Всё проходит нормально, но когда доходит до job.OnTimer := jobTimer;, получаю сообщение об ошибке от кимпилятора: "[Error] QTSaver.dpr(176): Incompatible types: method pointer and regular procedure". Подскажите как быть. Спасибо.

Вернуться к началу