Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
#1

Неправильная работа Sleep(), в чём причина? - C++

16.01.2016, 15:38. Просмотров 306. Ответов 7
Метки нет (Все метки)

Использую функцию Sleep() для создания задержки потока в миллисекундах.
Написал тестовую программу, тестирующую эту функцию.
Установил в цикле задержку в 1 миллисекунду (Sleep(1)).
Высокоточным таймером проверял эту функцию и оказалось, что она странным образом работает неправильно, если в ОС у меня ничего не запущено. Задержка вместо 1 миллисекунды растягивается на 16 миллисекунд, но стоит мне только запустить браузер, задержка снова становится 1 миллисекунда. После завершения работы браузера задержка снова 16 миллисекунд.

Результат работы тестовой программы во вложении.

В чём причина, почему так происходит?
Миниатюры
Неправильная работа Sleep(), в чём причина?  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,256
Завершенные тесты: 1
16.01.2016, 16:07     Неправильная работа Sleep(), в чём причина? #2
А разве кто-нибудь обещал, что Sleep будет с точностью до миллисекунд
выдерживать заданный интервал? Я вроде такого не видел.
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
16.01.2016, 18:39  [ТС]     Неправильная работа Sleep(), в чём причина? #3
А разве кто-нибудь обещал, что Sleep будет с точностью до миллисекунд
выдерживать заданный интервал? Я вроде такого не видел.
Да, описание функции это обещало и ещё её параметр принимает количество миллисекунд.

Кстати, а как можно по-другому обеспечить минимальную задержку, мне нужно, чтобы просто бесконечный цикл не отбирал все ресурсы процессора, пока использую Sleep(0), ОС не подвисает, но в диспетчере задач просто не красиво смотрится 25% ЦП.
Убежденный
Системный программист
Эксперт С++
15247 / 6879 / 1092
Регистрация: 02.05.2013
Сообщений: 11,256
Завершенные тесты: 1
16.01.2016, 19:24     Неправильная работа Sleep(), в чём причина? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от noname664 Посмотреть сообщение
Да, описание функции это обещало и ещё её параметр принимает количество миллисекунд.
А внизу сказано:

Sleep function
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
This function causes a thread to relinquish the remainder of its time slice and become unrunnable for an interval based on the value of dwMilliseconds. The system clock "ticks" at a constant rate. If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on. To increase the accuracy of the sleep interval, call the timeGetDevCaps function to determine the supported minimum timer resolution and the timeBeginPeriod function to set the timer resolution to its minimum.
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
16.01.2016, 20:44  [ТС]     Неправильная работа Sleep(), в чём причина? #5
Если короче, то это значит:
Функция Sleep приостанавливает поток на время в миллисекундах, указанных в аргументе, но её работа не гарантируется в том виде, в котором Вы её себе представляете. Это плохо.
И всё-же, а может есть ли аналог, мне бы просто заменить Sleep(0) на что-нибудь другое, а то 25% ЦП не нравится, хотя ничего не подвисает.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
18.01.2016, 11:05     Неправильная работа Sleep(), в чём причина? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
18.01.2016, 14:01  [ТС]     Неправильная работа Sleep(), в чём причина? #7
Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
Создал две версии тестовой программы выше, в одну добавил timeBeginPeriod(1), в другой оставил как есть.
Запустил версию без timeBeginPeriod(1), она выдавала 16 мс, но как только запустил версию с timeBeginPeriod(1), то таймер и там и там стал выдавать 1 мс.

Спасибо, проблема решена успешно.

Вопрос исчерпан.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2016, 20:30     Неправильная работа Sleep(), в чём причина?
Еще ссылки по теме:
Неправильная работа цикла C++
Неправильная работа программы C++
Неправильная работа с файлами C++
C++ Неправильная работа Функции strcmp
Неправильная работа функции класса Visual C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
18.01.2016, 20:30     Неправильная работа Sleep(), в чём причина? #8
noname664, просто на будущее, их нужно использовать в паре, например, при запуске программы вызываешь timeBeginPeriod(1), при выходе timeEndPeriod(1).
Yandex
Объявления
18.01.2016, 20:30     Неправильная работа Sleep(), в чём причина?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru