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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2013, 12:15   #1
SashaAVP
 
Регистрация: 24.04.2013
Сообщений: 7
По умолчанию С++. Работа с двумя таймерами

Вопрос.
Есть необходимость работы с двумя таймерами. Но с разным приоритетом. Так, чтобы один таймер мог прерывать работу обработчика другого таймера. Все другие функции же не выполнялись бы до окончания работы обработчиков обоих таймеров
Как организовать подобное в VisualC++???

Спасибо, Александр
SashaAVP вне форума Ответить с цитированием
Старый 24.04.2013, 14:17   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

VisualC наводит на мысль о том, что все это будет под Windows. В винде у таймеров нет приоритетов - надо будет делать самому. Пока обслуживается один таймер второй сигнал придти не может. Ваше объяснение несколько невнятно - попробуйте объяснить зачем вообще нужны два таймера и приоритеты.
waleri вне форума Ответить с цитированием
Старый 24.04.2013, 16:37   #3
SashaAVP
 
Регистрация: 24.04.2013
Сообщений: 7
По умолчанию

waleri
Да-да. Попробую объяснить зачем.
У меня есть функция построения графиков неких входных сигналов.
Она вызывается периодически, к примеру, раз в 200мсек.
Ее выполнение (построение графиков) длится примерно 100мсек.
В это время мне на вход (не суть важно какой))) поступают сигналы с периодом 20-50 мсек.
Мне их нужно принимать и буферизировать, чтобы потом передать функции построения графика.

Не спрашивайте, зачем мне понадобилось функцию построения графика закладывать в обработчик прерывания от первого таймера. Допустим, так надо .)))
Суть в том, что пока одна функа рисует график, другая функа (раз в 20-50мсек) должна прерывать ее работу, чтобы не пропустить приход новых данных.
Все же остальное в это время не должно мешать работе этих двух фунок.

И именно вот эту ситуацию мне никак не удается разрулить средствами VisualC++.
Либо все прочие функи моего проекта начинают мешать работе ф-ии прорисовки графика (если, к примеру, организовать ее в виде срёда), либо функа считки новых данных не может прервать работу построения графика (а это 100-300мсек) и теряет данные.

Спасибо, Александр
SashaAVP вне форума Ответить с цитированием
Старый 24.04.2013, 16:43   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы как бы в виндоузе а не досе, тут нет прерываний.
зато тут есть многопоточность, один поток(основной-гуишный) рисует график, второй же принимает данные.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.04.2013, 16:53   #5
SashaAVP
 
Регистрация: 24.04.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
один поток(основной-гуишный) рисует график, второй же принимает данные.
Да-да. Эту отличную идею я уже реализовывал.
Все супер. За одним неприятным исключением.
Если просто организовывать обе функции как простые потоки, то их работу начинают прерывать все, кому не лень (а у меня есть кому))). В итоге я получаю не просто "кашу", но и Rub-time-error -ы.

Мне надо запретить прерывание этих двух фунок кем бы то ни было на время их выполнения. А заодно и синхронизировать по времени.
Это посредством организации обычных потоков мне не удается сделать.

Спасибо, Александр
SashaAVP вне форума Ответить с цитированием
Старый 24.04.2013, 17:52   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Сделайте один таймер на 50мс, и каждый вызов читайте данные а каждый четвертый вызов делайте отрисовку.
Грубо говоря делаем счетчик и if (0 == (counter % 4)) рисуем()
waleri вне форума Ответить с цитированием
Старый 24.04.2013, 19:12   #7
SashaAVP
 
Регистрация: 24.04.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Сделайте один таймер на 50мс, и каждый вызов читайте данные а каждый четвертый вызов делайте отрисовку.
Грубо говоря делаем счетчик и if (0 == (counter % 4)) рисуем()
Отрисовка занимает от 100 до 200 мсек.
Если функция отрисовки вызывается в обработчике таймера, то после четырех считок будет пауза в считывании входных данных до 200мсек (пока старые не отрисуются). Ибо сам себя таймер прервать не может.
SashaAVP вне форума Ответить с цитированием
Старый 24.04.2013, 19:26   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от SashaAVP Посмотреть сообщение
Да-да. Эту отличную идею я уже реализовывал.
Все супер. За одним неприятным исключением.
Если просто организовывать обе функции как простые потоки, то их работу начинают прерывать все, кому не лень (а у меня есть кому))). В итоге я получаю не просто "кашу", но и Rub-time-error -ы.

Мне надо запретить прерывание этих двух фунок кем бы то ни было на время их выполнения. А заодно и синхронизировать по времени.
Это посредством организации обычных потоков мне не удается сделать.

Спасибо, Александр
под отрисовку нет нужды делать отдельный поток.(ошибки могли быть изза этого)

а насчет прерывания, прерывания кода нету как такового, есть вытесняющая многопоточность, а винда не является системой реального времени чтобы гарантировать не прерываемость.
да и уверены ли вы что сделать все корректно, синхронизации и тп?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.04.2013, 10:44   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Чтото больно медленно рисуется, но даже если так, в отдельных фазах рисования проверяйте сколько прошло времени и если пора читать данные, то прервитесь чтоб прочитать новые, потом рисуйте дальше. Сам себя таймер прервать не может но ваш код может. Уж не знаю, что вы рисуете, но 5 FPS - это жутко мало, просто неестественно. Разные 3Д стрелялки спокойно "разгоняются" до 100 FPS.

Далее, даже если все так плохо, как вы говорите, ничего не мешает сделать один таймер, который читает данные там каждые 50мс и каждые 200мс запускает поток для рисование (или шлет сигнал запущенному потоку). Главное разобраться с доступом к данным - синхронизация и прочее и прочее. Проще всего подготовить *все* данные в таймере (в отдельный буфер) и потом послать этот буфер рисующему потоку - тогда не надо будет синхронизацию делать, кроме как для посылки сигнала.

Кстати, вы в курсе, что таймеры в Windows далеко не гарантированы? Т.е. вам надо 50мс но таймер вполне может срабатывать и через 40 или через 100 а то и еще реже - учитывайте это!

Последний раз редактировалось waleri; 25.04.2013 в 10:48.
waleri вне форума Ответить с цитированием
Старый 25.04.2013, 17:03   #10
SashaAVP
 
Регистрация: 24.04.2013
Сообщений: 7
По умолчанию

Спасибо Пепел Феникса.
Спасибо waleri.

Я все понял. И буду пробовать иные способы (о которых вы упомянули).

"5 FPS - это жутко мало, просто неестественно. Разные 3Д стрелялки спокойно "разгоняются" до 100 FPS"
Да, согласен.
Но игрушки пишут серьезные фирмы с серьезными графическими движками.
А я свою графику сам писал )))))))))
Ну ничего. Буду оптимизировать и пытаться синхронизировать грамотно потоки, если другого выхода нет.

Спасибо, Александр
SashaAVP вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с двумя таблицами SoftKoc SQL, базы данных 3 02.04.2013 19:06
работа с таймерами megostudent Общие вопросы Delphi 22 23.09.2011 17:04
Работа с двумя БД ADO. alexeybest БД в Delphi 1 16.02.2010 16:10
Работа с таймерами Mr. Demetrius JavaScript, Ajax 7 16.03.2008 22:29
работа с двумя книгами Реланиум Microsoft Office Excel 2 23.11.2006 16:37