75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
|
|
1 | |
Создание таймера без WinApi11.05.2018, 08:08. Показов 2353. Ответов 31
Метки нет (Все метки)
Здравствуйте. Кто-нибудь делал реализацию таймеров без использования WinApi функций, а чисто средствами С++ и чтобы он работал в отдельном потоке(под Windows)? Если да, то подкиньте идею в каком направлении двигаться.
0
|
11.05.2018, 08:08 | |
Ответы с готовыми решениями:
31
Создание окна без WinAPI Генерация GUID (без WinAPI) Вывод текста без WinAPI Преобразование кодировки без WinAPI |
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
|
|
11.05.2018, 10:22 [ТС] | 21 |
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|||||||||||
11.05.2018, 10:56 | 22 | ||||||||||
1
|
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,628
|
|
11.05.2018, 11:47 | 23 |
Operok, и в чём польза такого решения? Ты же останавливаешь основной поток. Проще sleep_for в него и вставить.
Таймер помимо отсчёта времени ещё и событие генерирует, а значит всё равно придётся WinAPI использовать.
0
|
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 707
|
|
11.05.2018, 11:53 | 24 |
Fulcrum_013, для будильника.
Добавлено через 4 минуты nmcf, может TC, например, под Linux делает.
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
11.05.2018, 13:00 | 25 |
Основной поток блокируется только из-за моего примера использования предложенной мною функции. В start_timer можно передать какой угодно функтор (соответствующий сигнатуре), а что делать после вызова функции решайте сами.
Добавлено через 3 минуты на худой конец можно и через asio https://www.boost.org/doc/libs... imer2.html Замечу, что в boost::asio для таймеров создаётся отдельный поток на каждый io_service::run. Т.е. если кроме таймеров мы ничего не используем, то помимо блокировки потока вызовом run мы имеем ещё и дополнительный поток для таймера (два дополнительный потока на какой-то таймер!!!).
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
12.05.2018, 03:26 | 27 |
Sasha38, для будильника 15мс выше крыши, там точности секунда хватит а то и минута. При этом под виндой/линухой лучшую точность выше 15 мсек не получите даже если аппаратный таймер прикрутите. Вообще точность срабатывания таймеров под виндой и вообще любой офисной осъю не гарантирована а соответственно само понятие о точность срабатывания - весьма условное.
Добавлено через 5 часов 11 минут qwe123qwea, Не получится это не потоками ни даже прикручиванием аппаратного таймера высокой точности. Это связано с моделью обработки устройств и планирования задач (квантования времени потоков) используемыми в оффисных осях. То чего вы хотите добиться реально только под реалтайм осью коими не являются ни винда ни линуха. Т.е. GetTickCount возвращает значение хранимое и обновляемое осью под капотом. Если оно приходит с непредсказуемыми рывками то это означает что оно и обновляется с точно такими же непредсказуемыми рывками. Другими словами - таймер на потоке не может быть точнее таймера API, скорее всего будет менее точным, и будет грузить проц без толку, потому что таймер апи не тратит время проца на проверку обновилоь значение или нет, а проверяет при обновлении есть ли события время вызова которых достигнуто. Для обеспечения точных таймеров нужно менять ядро оси. Добавлено через 9 минут wekfox, Таймер это подсчет количества переполнений специальной микросхемы-счетчика считающей импульсы строго заданной частоты, которая не менялась со времен рождения архитектуры IBM PC. Она к частоте проца не имеет ни малейшего отношения т.к. живет на своем генераторе. Т.е. количество тиков - это фактически количество прерываний по переполнению счетчика поступившего с этой микросхемы после старта системы. Добавлено через 7 минут Реально этой микрухи которая так и называется - таймер реального времени - достаточно для обеспечения точности порядка 1 микросекунды. Понижение точности относительно аппаратной связано с моделью обработки прерываний генерируемых этой микрухой. под ДОСкой микросекундная точность не вопросом была и на проце 8088 .
0
|
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
|
|
12.05.2018, 06:38 [ТС] | 28 |
Fulcrum_013, с тем что вы сказали, я обсолютно согласен. Но нашел одну статью(https://m.habr.com/post/319402/) и судя по всему можно вивинде выставлять таймеры до 500 микросекунд, но этот промежуток будет 500+микросекунд.
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
12.05.2018, 09:44 | 29 |
qwe123qwea, Нет никакой гарантии что это будет 500 микросекунд а не 500 милисекунд или 5 секунда. Во всяком случае гарантии что это будет каждый раз. Причем в любом случае точность будет меньше точности таймера API.
Добавлено через 2 минуты qwe123qwea, при этом стоит какому то потоку с высоким приоритетом подвиснуть в количестве n штук и таймер на потоке вообще не сработает.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
|
|
12.05.2018, 09:58 | 30 |
тут два пути или использовать мультимедиа таймер, раньше шел в поставках ДиректИкс, сейчас не знаю
позиционируют точность 1 мСек или стучатся напрямую к железу,это уровень драйверов, обращаться к системному таймеру, перепрограммировать его, но как к этому отнесется ОС? Linux так же как и Винда не система реального времени даже если удастся создать такой таймер, время реакции системы кто гарантирует? такие таймера возможны только на системах реального времени, например FreeRTOS
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
12.05.2018, 11:21 | 31 |
ValeryS, Уровень драйверов не поможет. Там на самих аппаратных прерываниях заглушки которые заносят событие в очередь. потом соответсвенно очереди ресумятся потоки драйверов-обработчиков. Очередь без преоритетов и ввозможности прерывания текущего обработчика. Собственно говоря в этом и есть отличие РТОС от офисной. В принципе из винды до XP включительно делали РТОС заменой ядра на очередь с приоритетами. Но как результат драйвера штатные переставали работать. Т.е. поделка была только под железо производимое Фуджитсу-Сименс и стоила порядка 50 килобаксов за копию. Томогавки кстати до сих пор на такой поделке для NT-4 летают.
У винды с .Net в комплекте (начиная с Vista) такая переделка как понял не возможна по причине того что реалтайм планировка задач поломает планировку элементов .Net (типа дефрагментации и т.д.) используемых как минимум API для повышения стабильности долговременного гоняния быдлокода, работающего вообще без башни в плане перевыделения и как следствие дефрагментации кучи в том числе и кучи компонентов оси.
0
|
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
|
|
12.05.2018, 11:56 [ТС] | 32 |
Это я понял, но всё же, таймер меньше 1 миллисекунды возможно реализовать, хоть и без гарантии его точного срабатывания.
Одним словом, лучше юзать предоставленное АРI и не изобретать велосипед. Всем спасибо за помощь.
0
|
12.05.2018, 11:56 | |
12.05.2018, 11:56 | |
Помогаю со студенческими работами здесь
32
Как удалить все файлы в папке без WinAPI ? Работа с файловой системой в консольном приложение без WinAPI, QT, BOOST и пр Игровые движки пишут сначала на c++ без использования WinAPI объясните как? Создание WinAPI контролов с ручной настройкой параметров Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |