Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2011, 22:59   #1
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию Проблема с сис таймером

Помогите найти ошибку.
Использую таймер в консоли
Код:
procedure StartTimer(interval:cardinal);
begin
TID := timeSetEvent(interval,0,@TimeCallBack,0,TIME_PERIODIC);
end;

procedure TimeCallback(TimerID,Msg : UINT; dwUser,dw1,dw2 : DWord); pascal;
begin
//выполняю действия
end;


starttimer(600000);//запускаю таймер
Вот только таймер отказывается работать более 3 с половиной минут И прикол в том, что раньше всё работало, и по ходу код не менял, а сейчас вот такая фигня
Lauri вне форума Ответить с цитированием
Старый 11.05.2011, 15:57   #2
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Никто не поможет? Может есть альтернатива такому таймеру кроме копонента?
Lauri вне форума Ответить с цитированием
Старый 08.11.2012, 16:48   #3
Lem0nti
Пользователь
 
Регистрация: 31.08.2011
Сообщений: 14
По умолчанию

Аналогичная проблема. Только у меня потолок - 1000000 миллисекунд (16 минут 40 секунд). В описании функции timeSetEvent написано, что задержка должна лежать в определённом диапазоне. Как узнать этот диапазон?
Lem0nti вне форума Ответить с цитированием
Старый 08.11.2012, 16:54   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а вы тики tick ставьте маленькие, секунду там... 500 миллисекунд и т.п., а в обработчике таймера используйте глобальный инкремент (этих пауз) некой переменной, скажем P , тогда необходимая задержка:
Код:
inc(p);

if p > задержка/tick then begin
p:= 0;
// выполняем чего надо
end;
ферштеен?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.11.2012, 21:30   #5
Lem0nti
Пользователь
 
Регистрация: 31.08.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...а вы тики tick ставьте маленькие, секунду там... 500 миллисекунд и т.п., а в обработчике таймера используйте глобальный инкремент (этих пауз) некой переменной, скажем P , тогда необходимая задержка:
Код:
inc(p);

if p > задержка/tick then begin
p:= 0;
// выполняем чего надо
end;
ферштеен?
Это уход от проблемы. С таким же успехом я могу ставить период не больше минуты или двух. Или вообще использовать WaitforSingleObject или что-то ещё. И так до бесконечности усложнять алгоритм пока не перестану понимать что там происходит. Есть инструмент, он работает, надо понять его тонкую настройку. В случае если это не удастся, я найду как испортить себе жизнь обходными методами.

Удалось выяснить, что необходимая информация может быть добыта при помощи структуры TIMECAPS. Если кто сталкивался, подскажите, пожалуйста что из неё можно вытащить? Каким образом? Как понимать данные?
Lem0nti вне форума Ответить с цитированием
Старый 08.11.2012, 21:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Может есть альтернатива такому таймеру кроме копонента?
Сопроцесс создать с Sleep-ом на нужную величину не желаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2012, 22:18   #7
Lem0nti
Пользователь
 
Регистрация: 31.08.2011
Сообщений: 14
По умолчанию

Судя по всему, надо дать некоторые дополнительные объяснения .
Нет, слипы не подходят. Это служба, куча параллельных потоков с самой разнообразной работой - чтение/запись в БД, чтение/запись на диск, работа с ком-портом, работа с сетью, напоминалки для подключённых клиентских приложений, ответы по http протоколу, запросы по нему же. Каждая отдельная задача реализована в отдельном плугине, которые подгружаюся при старте, подтягиваются настройки, выставляются режимы работы, затем создаются потоки, которые работают с этими плугинами, дёргая их полезную логику периодически или постоянно, или не дёргая. Во время программирования мне неизвестно достоверно сколько и какого рода, этих потоков будет. Среди прочего есть такие, которые должны отрабатывать по таймеру, время таймера от итерации к итерации может меняться. Обнаружилось, что при выставлении периода работы какой-либо задачи (плугина) больше чем на 16 минут 40 секунд, исполнние не идёт и ммРезулт равен 0. Текст ошибки взятый через SysErrorMessage не информативен. Если я буду использовать слипы, то буду испытывать проблемы при остановке и взаимодействии между потоками.

И самое главное - обходных методов придумать с десяток я в состоянии. Прошу помощи в отношении именно работы с мультимедиа таймерами. Это позволит обойтись минимумом переделок и не добавлять механизмы новыми логиками.
Lem0nti вне форума Ответить с цитированием
Старый 08.11.2012, 22:26   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Это уход от проблемы.
вы не правы, это обход проблемы.

Цитата:
С таким же успехом я могу ставить период не больше минуты или двух.
бред. Переменная-счетчик никак не влияет на период таймера, период выполнения цикла кода - да.

Цитата:
И так до бесконечности усложнять алгоритм пока не перестану понимать что там происходит.
где же тут усложнение, у вас один таймер.

Цитата:
должны отрабатывать по таймеру, время таймера от итерации к итерации может меняться
это элементарно регулируется условием в коде выше.

Цитата:
Обнаружилось, что при выставлении периода работы какой-либо задачи (плугина) больше чем на 16 минут 40 секунд, исполнние не идёт и ммРезулт равен 0. Текст ошибки взятый через SysErrorMessage не информативен.
Win ОС - не среда реального времени, никто вам гарантировать ничего не обязан ...обратитесь к WinRT.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 08.11.2012 в 22:30.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вкл сис. динамик legendary Компьютерное железо 6 09.11.2010 17:23
проблема с таймером javascript storm296 JavaScript, Ajax 1 03.08.2010 15:38
перехват сис сообщений legendary Общие вопросы Delphi 0 03.08.2010 13:35
для сис админов dimon142 Компьютерное железо 8 11.08.2009 12:52