Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > установка таймера без формы


Автор: BLACK_KOT 14.4.2012, 23:20
Код


program BLACK_KOT;

uses Messages,Windows;

label l1;

procedure timer;
begin
MessageBox(0,'','hello',MB_OK);
end;

begin
l1:

if GetKeyState(75) < 0 then SetTimer(0,100,1000,@timer);

sleep(10); //чтобы не грузить процессор

goto l1;
end.


нажатие клавиши отлавливает на отлично, а вот таймер не запускается. помогите  разобраться

Автор: kami 15.4.2012, 10:58
Цитата(BLACK_KOT @  14.4.2012,  23:20 Найти цитируемый пост)
а вот таймер не запускается.

Цитата

When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

То есть обработка сообщений в любом случае нужна.

Автор: BLACK_KOT 15.4.2012, 23:04
то есть если я не создаю формы - я не могу обрабатывать сообщения, а значит не могу и создавать таймеры? 

печалька.. выхода вообще нет?

Автор: Ne1tr1n0 16.4.2012, 12:51
Помимо обычного есть куда других таймеров. Например http://www.delphisources.ru/pages/faq/base/create_mm_timer.html(timeSetEvent/timeKillEvent). Ещё есть Waitable-таймер (CreateWaitableTimer), его можно попробовать.

Автор: Ne1tr1n0 16.4.2012, 13:36
Вот вариант адаптации твоего кода к мультимедийному таймеру:
Код

program Project1;

uses
  MMSystem, Windows;

label l1;

var
   mmResult: Integer;

procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); pascal;
begin
  MessageBox(0, 'hello', 'hello', MB_OK);
end;

begin
l1:
if GetKeyState(75) < 0 then
  mmResult:=timeSetEvent(1000, 0, @TimeCallBack, 0, TIME_PERIODIC);
sleep(10); //чтобы не грузить процессор

goto l1;
end.

Автор: BLACK_KOT 16.4.2012, 14:55
что-то у меня работает код предыдущий не правильно. 
Код

if GetKeyState(75) < 0 then
  mmResult:=timeSetEvent(5000, 0, @TimeCallBack, 0, TIME_PERIODIC);

через 5 секунд срабатывает таймер, и он по идее должен ждать ещё 5 секунд и снова выполнять процедуру. но после первого срабатывания таймер начинает постоянно выполнять процедуру, так что я не успевай закрыть "hello" сообщение, как тут же вылезает ещё одно такое же. то есть не работает периодичность.

Автор: Ne1tr1n0 16.4.2012, 15:39
А, да, пардон, это потому что пока нажата кнопка код успевает выполниться несколько раз и соответственно несколько таймеров создается.
Можно завести переменную-флаг, и проверять её каждый раз перед установкой таймера помимо нажатости клавиши. Либо проверять переменную mmResult перед вызовом timeSetEvent, но надежднее имхо свою переменную завести.
Кстати что за кнопка такая с кодом 75? Что-то не нашёл среди констант такую.
Вот так вроде нормально срабатывает.
Код

program Project1;

uses
  MMSystem, Windows;

label l1;

var
   mmResult: Integer;
   eventset: boolean;

procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); pascal;
begin
  MessageBox(0, 'hello', 'hello', MB_OK);
end;

begin
eventset:=false;
l1:
if GetKeyState(75) < 0 then
    if not eventset then
    begin
      mmResult:=timeSetEvent(5000, 0, @TimeCallBack, 0, TIME_PERIODIC);
      eventset:=true;
    end;
sleep(10); //чтобы не грузить процессор
goto l1;
end.

Автор: BLACK_KOT 16.4.2012, 17:37
ну точно, ё маё, я сам ступил.  спасибо огромное,  а кнопка 75 это просто клавиша K английская. она для примера тут.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)