C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Корректное завершение работы мультимедиа-таймера при закрытии формы  (Прочитано 1651 раз)
mahacytl
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 10


Корректное завершение работы мультимедиа-таймера при закрытии формы
« : 27 Октябрь 2011, 09:11:06 »

Уважаемые форумчане!
Наваял я прогу, в которой происходит обмен по USB порту через 20 мсек.
С учётом малой длительности цикла использовал медиатаймер ММТ.
Работа программы протекает нормально, через CALLBACK.
Но при закрытии формы периодически происходят сообщения о неверном завершении процесса-"Abnormal program termination"
Код
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
   MMTimerID = 0;
   MMlasttime = 0;
   STANlasttime = 0;
   clicksMM = 0;
   clicksST = 0;
   MMTimerID =  timeSetEvent(20, 0, TimerProc,NULL, TIME_PERIODIC);
}
 

Действие при закрытии формы
Код
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 
   if (MMTimerID) timeKillEvent(MMTimerID);
 
}
Если делаю на TTimerе, всё заканчивается корректно-но не устраивает его минимальное время.


« Последнее редактирование: 27 Октябрь 2011, 09:55:21 от mahacytl » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Корректное завершение работы мультимедиа-таймера при закрытии формы
« Ответ #1 : 27 Октябрь 2011, 10:33:10 »

Попробуй создавать таймер так:
Код
MMTimerID =  timeSetEvent(20, 0, TimerProc,NULL, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);
Это запретит таймеру вызывать свою Callback-функцию после timeKillEvent. Скорее всего - проблема именно в том, что после закрытия формы таймер еще раз вызывает Callback, и вылетает ошибка. А вообще, лучше делать удаление таймера не в OnClose, а в OnCloseQuery... Удалил, подождал какое-то время, чтобы быть уверенным, что timeKillEvent отработал, и больше вызовов TimerProc не будет, и потом уже закрываешь форму...
Записан
mahacytl
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 10


Re: Корректное завершение работы мультимедиа-таймера при закрытии формы
« Ответ #2 : 27 Октябрь 2011, 13:12:31 »

Спасибо за ответ.
У меня было тоже такое сомнение, но, к сожалению, оно не подтвердилось.
Кардинально снимает проблемы с выходом закомментирование всего кода CALLBACK функции, а точнее закомментирование вызова функций приёма-передачи через порт USB.
Пробовал на эти функции поставить критические секции, результат вроде есть, но не 100%ный.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Корректное завершение работы мультимедиа-таймера при закрытии формы
« Ответ #3 : 27 Октябрь 2011, 14:00:49 »

1. в упор не вижу timeBerginPeriod/timeEndPeriod
2. для timeSetEvent рекомендуется использовать события а не калбаки - если ты читал документацию (хм, маловероятно ) то знаешь что в калбаке весьма мало можно делать традиционными методами
3. (!) учись выводить код в потоки

PS как поймать "лишний" калбак - заведи флаг, выставляй его перед timeKillEvent и по нему кидай MsgBox в калбаке - сбоя это не вызовет, а событие ты глазами увидишь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.153 секунд. Запросов: 22.