75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
1

Создание таймера без WinApi

11.05.2018, 08:08. Показов 2353. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Кто-нибудь делал реализацию таймеров без использования WinApi функций, а чисто средствами С++ и чтобы он работал в отдельном потоке(под Windows)? Если да, то подкиньте идею в каком направлении двигаться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2018, 08:08
Ответы с готовыми решениями:

Создание окна без WinAPI
Хотелось узнать, как создавать окна без использования WinAPI.

Генерация GUID (без WinAPI)
Подкиньте код генерации GUID на чистом С++ :)

Вывод текста без WinAPI
Здравствуйте! Пишу OS на C++. Как мне создать функцию printf() без использования айостримов и...

Преобразование кодировки без WinAPI
Привет! Может кто знает, как преобразовывать из UTF8 в CP1251 и обратно без внешних утилит (типа...

31
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
11.05.2018, 10:22  [ТС] 21
Author24 — интернет-сервис помощи студентам
wekfox, если что-то получится, возможно.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
11.05.2018, 10:56 22
C++
1
2
3
4
5
6
7
8
9
template <class Handler>
void start_timer(size_t msec, Handler&& handler)
{
    std::thread([msec, handler = std::forward<Handler>(handler)] 
    { 
        std::this_thread::sleep_for(std::chrono::milliseconds(msec));
        handler();
    }).detach();
}
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
std::atomic_bool flag;
 
int main()
{
    flag = true;
    start_timer(2000, [] { flag = false; });
    
    while (flag);
    std::cout << "Done!\n";
}
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
Цитата Сообщение от nmcf Посмотреть сообщение
Ты же останавливаешь основной поток.
Основной поток блокируется только из-за моего примера использования предложенной мною функции. В start_timer можно передать какой угодно функтор (соответствующий сигнатуре), а что делать после вызова функции решайте сами.

Добавлено через 3 минуты
на худой конец можно и через asio
https://www.boost.org/doc/libs... imer2.html
Замечу, что в boost::asio для таймеров создаётся отдельный поток на каждый io_service::run. Т.е. если кроме таймеров мы ничего не используем, то помимо блокировки потока вызовом run мы имеем ещё и дополнительный поток для таймера (два дополнительный потока на какой-то таймер!!!).
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.05.2018, 13:12 26
Цитата Сообщение от qwe123qwea Посмотреть сообщение
Если да, то подкиньте идею в каком направлении двигаться
thread, chrono
Хотя по сути это будут лишь обвязки над WinAPI функциями
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
Цитата Сообщение от qwe123qwea Посмотреть сообщение
вообще это мне нужны таймеры такой высокой точности, хочу либу написать, где можно будет выделять таймеры с разной точностью.
тут два пути или использовать мультимедиа таймер, раньше шел в поставках ДиректИкс, сейчас не знаю
позиционируют точность 1 мСек
или стучатся напрямую к железу,это уровень драйверов, обращаться к системному таймеру, перепрограммировать его, но как к этому отнесется ОС?
Цитата Сообщение от Sasha38 Посмотреть сообщение
например, под Linux делает.
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
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
qwe123qwea, Нет никакой гарантии что это будет 500 микросекунд а не 500 милисекунд или 5 секунда. Во всяком случае гарантии что это будет каждый раз. Причем в любом случае точность будет меньше точности таймера API.

Добавлено через 2 минуты
qwe123qwea, при этом стоит какому то потоку с высоким приоритетом подвиснуть в количестве n штук и таймер на потоке вообще не сработает.
Это я понял, но всё же, таймер меньше 1 миллисекунды возможно реализовать, хоть и без гарантии его точного срабатывания.
Одним словом, лучше юзать предоставленное АРI и не изобретать велосипед.
Всем спасибо за помощь.
0
12.05.2018, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2018, 11:56
Помогаю со студенческими работами здесь

Как удалить все файлы в папке без WinAPI ?
Ну собственно дубль шапки: Как удалить все файлы в папке без WinAPI ? Тоесть на чистом C++ без...

Работа с файловой системой в консольном приложение без WinAPI, QT, BOOST и пр
Ребят, кто подскажет, можно ли в консольном приложение работать с файловой системой на чистом языке...

Игровые движки пишут сначала на c++ без использования WinAPI объясните как?
Здравствуйте!Модераторы похожих вопросов у меня много но конкретного ответа я не получил....

Создание WinAPI контролов с ручной настройкой параметров
Контролы в WinAPI это те же окна, поэтому создаются через CreateWindowEx. А как можно создать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru