|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.04.2013, 12:15 | #1 |
Регистрация: 24.04.2013
Сообщений: 7
|
С++. Работа с двумя таймерами
Вопрос.
Есть необходимость работы с двумя таймерами. Но с разным приоритетом. Так, чтобы один таймер мог прерывать работу обработчика другого таймера. Все другие функции же не выполнялись бы до окончания работы обработчиков обоих таймеров Как организовать подобное в VisualC++??? Спасибо, Александр |
24.04.2013, 14:17 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
VisualC наводит на мысль о том, что все это будет под Windows. В винде у таймеров нет приоритетов - надо будет делать самому. Пока обслуживается один таймер второй сигнал придти не может. Ваше объяснение несколько невнятно - попробуйте объяснить зачем вообще нужны два таймера и приоритеты.
|
24.04.2013, 16:37 | #3 |
Регистрация: 24.04.2013
Сообщений: 7
|
waleri
Да-да. Попробую объяснить зачем. У меня есть функция построения графиков неких входных сигналов. Она вызывается периодически, к примеру, раз в 200мсек. Ее выполнение (построение графиков) длится примерно 100мсек. В это время мне на вход (не суть важно какой))) поступают сигналы с периодом 20-50 мсек. Мне их нужно принимать и буферизировать, чтобы потом передать функции построения графика. Не спрашивайте, зачем мне понадобилось функцию построения графика закладывать в обработчик прерывания от первого таймера. Допустим, так надо .))) Суть в том, что пока одна функа рисует график, другая функа (раз в 20-50мсек) должна прерывать ее работу, чтобы не пропустить приход новых данных. Все же остальное в это время не должно мешать работе этих двух фунок. И именно вот эту ситуацию мне никак не удается разрулить средствами VisualC++. Либо все прочие функи моего проекта начинают мешать работе ф-ии прорисовки графика (если, к примеру, организовать ее в виде срёда), либо функа считки новых данных не может прервать работу построения графика (а это 100-300мсек) и теряет данные. Спасибо, Александр |
24.04.2013, 16:43 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
вы как бы в виндоузе а не досе, тут нет прерываний.
зато тут есть многопоточность, один поток(основной-гуишный) рисует график, второй же принимает данные. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
24.04.2013, 16:53 | #5 | |
Регистрация: 24.04.2013
Сообщений: 7
|
Цитата:
Все супер. За одним неприятным исключением. Если просто организовывать обе функции как простые потоки, то их работу начинают прерывать все, кому не лень (а у меня есть кому))). В итоге я получаю не просто "кашу", но и Rub-time-error -ы. Мне надо запретить прерывание этих двух фунок кем бы то ни было на время их выполнения. А заодно и синхронизировать по времени. Это посредством организации обычных потоков мне не удается сделать. Спасибо, Александр |
|
24.04.2013, 17:52 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Сделайте один таймер на 50мс, и каждый вызов читайте данные а каждый четвертый вызов делайте отрисовку.
Грубо говоря делаем счетчик и if (0 == (counter % 4)) рисуем() |
24.04.2013, 19:12 | #7 | |
Регистрация: 24.04.2013
Сообщений: 7
|
Цитата:
Если функция отрисовки вызывается в обработчике таймера, то после четырех считок будет пауза в считывании входных данных до 200мсек (пока старые не отрисуются). Ибо сам себя таймер прервать не может. |
|
24.04.2013, 19:26 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
а насчет прерывания, прерывания кода нету как такового, есть вытесняющая многопоточность, а винда не является системой реального времени чтобы гарантировать не прерываемость. да и уверены ли вы что сделать все корректно, синхронизации и тп? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
25.04.2013, 10:44 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Чтото больно медленно рисуется, но даже если так, в отдельных фазах рисования проверяйте сколько прошло времени и если пора читать данные, то прервитесь чтоб прочитать новые, потом рисуйте дальше. Сам себя таймер прервать не может но ваш код может. Уж не знаю, что вы рисуете, но 5 FPS - это жутко мало, просто неестественно. Разные 3Д стрелялки спокойно "разгоняются" до 100 FPS.
Далее, даже если все так плохо, как вы говорите, ничего не мешает сделать один таймер, который читает данные там каждые 50мс и каждые 200мс запускает поток для рисование (или шлет сигнал запущенному потоку). Главное разобраться с доступом к данным - синхронизация и прочее и прочее. Проще всего подготовить *все* данные в таймере (в отдельный буфер) и потом послать этот буфер рисующему потоку - тогда не надо будет синхронизацию делать, кроме как для посылки сигнала. Кстати, вы в курсе, что таймеры в Windows далеко не гарантированы? Т.е. вам надо 50мс но таймер вполне может срабатывать и через 40 или через 100 а то и еще реже - учитывайте это! Последний раз редактировалось waleri; 25.04.2013 в 10:48. |
25.04.2013, 17:03 | #10 |
Регистрация: 24.04.2013
Сообщений: 7
|
Спасибо Пепел Феникса.
Спасибо waleri. Я все понял. И буду пробовать иные способы (о которых вы упомянули). "5 FPS - это жутко мало, просто неестественно. Разные 3Д стрелялки спокойно "разгоняются" до 100 FPS" Да, согласен. Но игрушки пишут серьезные фирмы с серьезными графическими движками. А я свою графику сам писал ))))))))) Ну ничего. Буду оптимизировать и пытаться синхронизировать грамотно потоки, если другого выхода нет. Спасибо, Александр |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с двумя таблицами | 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 |