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

C++

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

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

16.01.2016, 15:38. Просмотров 386. Ответов 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(), в чём причина? (C++):

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

Некорректная работа функции Sleep в цикле while - C++ Builder
При вызове из цикла do - while, sleep срабатывает только один раз. А как сделать, чтобы между итерациями была пауза? Для примера: ...

Работа с Canvas (причина ошибки)(Игра 2D) - C++ Builder
void __fastcall Thread::back_draw() { char ABC; #define A(i,j) ABC int i,j,x; for (i = 0; i < 8; i++) { for (j = 0; j...

Неправильная работа GetVolumeInformation - Visual C++
LPTSTR all_logical_discs, //все диски one_disc; TCHAR tmp;//временная для каждого диска all_logical_discs = new...

Неправильная работа функции класса - Visual C++
Функция от класса Sort() при работе выдает мусор. Помогите разобраться, в чем проблема? Класс: class File { public: ...

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

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

Кстати, а как можно по-другому обеспечить минимальную задержку, мне нужно, чтобы просто бесконечный цикл не отбирал все ресурсы процессора, пока использую Sleep(0), ОС не подвисает, но в диспетчере задач просто не красиво смотрится 25% ЦП.
0
Убежденный
Ушел с форума
Эксперт С++
15689 / 7199 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
16.01.2016, 19:24 #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.
0
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
16.01.2016, 20:44  [ТС] #5
Если короче, то это значит:
Функция Sleep приостанавливает поток на время в миллисекундах, указанных в аргументе, но её работа не гарантируется в том виде, в котором Вы её себе представляете. Это плохо.
И всё-же, а может есть ли аналог, мне бы просто заменить Sleep(0) на что-нибудь другое, а то 25% ЦП не нравится, хотя ничего не подвисает.
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
18.01.2016, 11:05 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
1
noname664
Задачи выполнил, ушёл
23 / 23 / 2
Регистрация: 16.10.2015
Сообщений: 353
18.01.2016, 14:01  [ТС] #7
Тут помогут timeBeginPeriod(1) и timeEndPeriod(1).
Создал две версии тестовой программы выше, в одну добавил timeBeginPeriod(1), в другой оставил как есть.
Запустил версию без timeBeginPeriod(1), она выдавала 16 мс, но как только запустил версию с timeBeginPeriod(1), то таймер и там и там стал выдавать 1 мс.

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

Вопрос исчерпан.
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Не работает код. В чём причина? Как "заставить" работать? - C++
Точка входа и т.д. #include <iostream> #include <string> #include "HConsole.h" int main() { HConsole.Write("Привет");...

Неправильная работа - C++
Почему на неправильно работает? #include<iostream> using namespace std; int main() { int b; for (int i=0; i<=14;...

Неправильная работа с файлами - C++
#include <iostream.h> #include <fstream.h> #include <windows.h> #include <string> struct student { char name; char...

Неправильная работа исключений - C++
Сделал в программе исключения, если пользователь направльно ввводит значения: // englerr.cpp // контроль ввода данных для класса...


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

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

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