Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
noname664
Задачи выполнил, ушёл
24 / 26 / 7
Регистрация: 16.10.2015
Сообщений: 345
1

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

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

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

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

В чём причина, почему так происходит?
0
Миниатюры
Неправильная работа Sleep(), в чём причина?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2016, 15:38
Ответы с готовыми решениями:

Работа с формой в Sleep
Здравствуйте! Подскажи, у меня в программе есть пара Sleepов, 1-5 секунд. Но во...

Некорректная работа функции Sleep в цикле while
При вызове из цикла do - while, sleep срабатывает только один раз. А как...

Работа с Canvas (причина ошибки)(Игра 2D)
void __fastcall Thread::back_draw() { char ABC; #define A(i,j) ABC int...

Неправильная работа GetVolumeInformation
LPTSTR all_logical_discs, //все диски one_disc; TCHAR...

Неправильная работа функции класса
Функция от класса Sort() при работе выдает мусор. Помогите разобраться, в чем...

7
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
16.01.2016, 16:07 2
А разве кто-нибудь обещал, что Sleep будет с точностью до миллисекунд
выдерживать заданный интервал? Я вроде такого не видел.
0
noname664
Задачи выполнил, ушёл
24 / 26 / 7
Регистрация: 16.10.2015
Сообщений: 345
16.01.2016, 18:39  [ТС] 3
А разве кто-нибудь обещал, что Sleep будет с точностью до миллисекунд
выдерживать заданный интервал? Я вроде такого не видел.
Да, описание функции это обещало и ещё её параметр принимает количество миллисекунд.

Кстати, а как можно по-другому обеспечить минимальную задержку, мне нужно, чтобы просто бесконечный цикл не отбирал все ресурсы процессора, пока использую Sleep(0), ОС не подвисает, но в диспетчере задач просто не красиво смотрится 25% ЦП.
0
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
16.01.2016, 19:24 4
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от 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.
0
noname664
Задачи выполнил, ушёл
24 / 26 / 7
Регистрация: 16.10.2015
Сообщений: 345
16.01.2016, 20:44  [ТС] 5
Если короче, то это значит:
Функция Sleep приостанавливает поток на время в миллисекундах, указанных в аргументе, но её работа не гарантируется в том виде, в котором Вы её себе представляете. Это плохо.
И всё-же, а может есть ли аналог, мне бы просто заменить Sleep(0) на что-нибудь другое, а то 25% ЦП не нравится, хотя ничего не подвисает.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
18.01.2016, 11:05 6
Лучший ответ Сообщение было отмечено noname664 как решение

Решение

Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
1
noname664
Задачи выполнил, ушёл
24 / 26 / 7
Регистрация: 16.10.2015
Сообщений: 345
18.01.2016, 14:01  [ТС] 7
Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
Создал две версии тестовой программы выше, в одну добавил timeBeginPeriod(1), в другой оставил как есть.
Запустил версию без timeBeginPeriod(1), она выдавала 16 мс, но как только запустил версию с timeBeginPeriod(1), то таймер и там и там стал выдавать 1 мс.

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

Вопрос исчерпан.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
18.01.2016, 20:30 8
noname664, просто на будущее, их нужно использовать в паре, например, при запуске программы вызываешь timeBeginPeriod(1), при выходе timeEndPeriod(1).
0
18.01.2016, 20:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2016, 20:30

Неправильная работа MoveWindow
Здравствуйте! При создании двумерного массива дочерних окон возникла проблема...

Лагнутость игры в графике и неправильная работа правильного алгоритма
Извините, что задаю две темы в одной, но я думаю, что они связаны между собой...

Int выдаёт на единичку меньше в чём причина
для работы программы нужен кусочек, который находит цифры (число знаков после...


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

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

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