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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2016, 00:21   #1
Владимир Борисович
Новичок
Джуниор
 
Регистрация: 08.05.2016
Сообщений: 2
По умолчанию DELPHI и мультимедиа таймер(ы) Windows

Я не программист, а электронщик-аппаратчик. Реализовал некий проект(с применением Delphi7), где станком с ЧПУ управляет самопальный контроллер(плата) на базе ATmega324P(RISC процессор) в режиме реального времени. Внешнюю связь с контроллером поддерживает комп с 32-разрядной ОС(WinXP или Win7) выполняющий роль терминала для связи оператора с контроллером через USB-COM адаптер. В программе на Delphi пришлось применить мультимедийный таймер (функция: timeSetEvent), который автоматически создает свой поток. Это понадобилось для связи компа с контроллером, дабы не возникал TimeOut (потеря связи с контроллером в течение некоего времени(доли секунды)).{Прошу прощения - это не единственный вариант решения "этого дела", но я выбрал этот вариант дабы не создавать свой уникальный поток}.
Все реализовано и все работает. Но сейчас, по прошествии некоторого времени у меня возникло 2 вопроса:
1. Что делал мультимедийный таймер Windows до того, как я его переинициировал в своей программе?
2. Возможно ли в своей программе запустить сразу несколько мультимедийных таймеров с разными задержками? Т.е. несколько раз применить функцию timeSetEvent для разных по времени таймеров одновременно работающих? (В MSDN об этом ничего не говорится).
Владимир Борисович вне форума Ответить с цитированием
Старый 08.05.2016, 07:14   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

1- ничего не делал, это виртуальный таймер.
2- можно. Но для того, чтобы мультимедийный таймер действительно работал с более высоким разрешением требуется перед его использованием задать timeBeginPeriod(), а после освободить timeEndPeriod(). При этом виртуальный таймер имеет просто более высокий приоритет выполнения своего потока. В MSDN как раз об этом говорится.

Цитата:
Это понадобилось для связи компа с контроллером, дабы не возникал TimeOut
для отслеживания потери связи высокая точность таймера не нужна вообще, там счет на секунды. А вот правильно задать таймауты для самого COM-порта для правильного приема потока байт (фреймов) более важная задача.
kutani вне форума Ответить с цитированием
Старый 09.05.2016, 19:32   #3
Владимир Борисович
Новичок
Джуниор
 
Регистрация: 08.05.2016
Сообщений: 2
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
1- ничего не делал, это виртуальный таймер.
2- можно. Но для того, чтобы мультимедийный таймер действительно работал с более высоким разрешением требуется перед его использованием задать timeBeginPeriod(), а после освободить timeEndPeriod(). При этом виртуальный таймер имеет просто более высокий приоритет выполнения своего потока. В MSDN как раз об этом говорится.

для отслеживания потери связи высокая точность таймера не нужна вообще, там счет на секунды. А вот правильно задать таймауты для самого COM-порта для правильного приема потока байт (фреймов) более важная задача.
Спасибо за ответ. Разобрался. В тестовой программке запустил три ММ-таймера с разными интервалами. Все три работают в одном потоке. Проблем нет.
timeBeginPeriod() и timeEndPeriod() не использовал. Где-то читал, что они необходимы при перенастройке уже ранее запущенного таймера.
Вероятно, что и для задания приоритета.

Параметры моих тестовых вариантов таймеров:

MMTimer1: = timeSetEvent(10,0,@MyProcTimer1,0,
TIME_CALLBACK_FUNCTION or TIME_PERIODIC);

MMTimer2:= timeSetEvent(20,timeGetMinPeriod,@M yProcTimer2,0,
TIME_CALLBACK_FUNCTION or TIME_PERIODIC);

MMTimer3:= timeSetEvent(100,10,@MyProcTimer3,0 ,
TIME_CALLBACK_FUNCTION or TIME_PERIODIC);

Насчет USB-COM порта особых проблем нет, поскольку происходит обмен короткими пакетами по 20 байт из главного потока по системному таймеру. Если пакет утерян или искажен, то следует его повторная посылка (до 3-х раз подряд). Мой TimeOut это не из приложений для Windows, а свой собственный = 0,6 сек. Если контроллер в течение этого времени не получает пакетов от терминала(компа), то происходит необратимый разрыв связи со стороны контроллера с остановкой выполняемой им задачи (это мое решение). ММ-таймер в своем потоке на компе контролирует активность главного потока по изменению некоего счетчика отосланных пакетов. Если счетчик перестал изменяться, значит произошла приостановка главного потока (замер на некоторое время, по временным причинам). И тогда (в течение этого времени) ММ-таймер начинает отсылать контроллеру (и принимать) дежурные(незначащие) пакеты, чтобы контроллер понял, что терминал жив, а не сдох. Этот случай не универсальный, а просто приемлемый для узкой конкретной задачи. Тем более, что программы для компа и для контроллера писал я сам.
Владимир Борисович вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер Windows Forms one2s Windows Forms 4 25.04.2013 19:33
Windows таймер с точностью до микро(нано)секунд с callback-функцией. Zarc Общие вопросы C/C++ 12 25.03.2013 16:07
Таймер (delphi) Георгий Златов Помощь студентам 1 07.02.2012 21:02
Delphi 7 таймер Seede1 Помощь студентам 4 11.10.2010 11:14
Таймер в delphi SysSt Помощь студентам 5 21.04.2010 11:16