Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> установка таймера без формы 
:(
    Опции темы
BLACK_KOT
Дата 14.4.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



Код


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.


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


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
kami
Дата 15.4.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(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.

То есть обработка сообщений в любом случае нужна.
PM MAIL WWW   Вверх
BLACK_KOT
Дата 15.4.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



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

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


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Ne1tr1n0
Дата 16.4.2012, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



Помимо обычного есть куда других таймеров. Например мультимедийный (timeSetEvent/timeKillEvent). Ещё есть Waitable-таймер (CreateWaitableTimer), его можно попробовать.
PM MAIL   Вверх
Ne1tr1n0
Дата 16.4.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



Вот вариант адаптации твоего кода к мультимедийному таймеру:
Код

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.

PM MAIL   Вверх
BLACK_KOT
Дата 16.4.2012, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



что-то у меня работает код предыдущий не правильно. 
Код

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

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


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
Ne1tr1n0
Дата 16.4.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



А, да, пардон, это потому что пока нажата кнопка код успевает выполниться несколько раз и соответственно несколько таймеров создается.
Можно завести переменную-флаг, и проверять её каждый раз перед установкой таймера помимо нажатости клавиши. Либо проверять переменную 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.

PM MAIL   Вверх
BLACK_KOT
Дата 16.4.2012, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.12.2006

Репутация: нет
Всего: -1



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


--------------------
                       .. я - демо версия Бога от Microsoft..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1234 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.