-
-
Поторопился я. Перепутал милли- и микро- секунды, этим все и объясняется.
-
Дело не только в милли или микросекундах скорее всего, просто WaitableTimer - более правильный путь под Windows.
-
Объяснил
-
Объяснил
-
> Дело не только в милли или микросекундах скорее всего, просто
> WaitableTimer - более правильный путь под Windows.
Скорее дело в APC.
-
> DayGaykin © (30.03.16 16:37) [4]
> Объяснил
Ну очевидно же, что при больших интервалах ожидания Sleep вызываемый периодически в цикле вынуждает поток пробуждаться, что препятствует выгрузке кода в файл подкачки, например. WaitForXXX не препятствуют и кроме того могут быть прерваны в любой момент времени.
-
> Ну очевидно же, что при больших интервалах ожидания Sleep
> вызываемый периодически в цикле вынуждает поток пробуждаться,
> что препятствует выгрузке кода в файл подкачки, например.
> WaitForXXX не препятствуют и кроме того могут быть прерваны
> в любой момент времени.
А с чего вы взяли? Если верить MSDN то приоритет у WaitForXXX и sleep аналогичны. И по идеи должны работать одинаково с подкачкой.
А вот WaitableTimer работает на APC, который завязан на прямую на прерывания. И их число может доходит до 10 000 в секунду.
Предположу что WaitableTimer может выдерживать паузы с точность до 10 мкс.
А на практике надо померить посмотреть.
-
Pavia © (31.03.16 08:47) [7]
"Вы, сударь, ерунду говорите. И хуже всего то, что говорите безапеляционно и уверенно"
-
> Pavia © (31.03.16 08:47) [7]
> А с чего вы взяли? Если верить MSDN то приоритет у WaitForXXX
> и sleep аналогичны.
Дело не в приоритете. Еще раз. Чтобы сделать задержку на большой интервал с помощью Sleep и одновременно иметь возможность прервать ожидание ничего не остается другого как поставить Sleep в цикле указав ему малый интервал и там в же в цикле периодически проверять не вышел ли большой интервал. Поток будет постоянно просыпаться после выхода из очередного Sleep. С WaitFor функциями (с помощью которых можно ожидать в том числе и WaitableTimer) поток будет спать до тех пор пока не наступит событие. И прервать его всегда можно. Разница налицо.
-
> DVM © (31.03.16 10:19) [9]
По поводу первого аргумента: "малый интервал" - это примерно 50 дней. Не слишком накладно поднимать из подкачки код раз в 50 дней.
В коде, что я привел в ссылке handle - локальная переменная. Я не уверен, но мне кажется, это означает, что прерывать в любой момент его никто не захочет.
К тому-же параметр функции - int (насколько я понимаю в си - это тоже 32 бита), поэтому слишком большой интервал для sleep задать и не получится.
Поэтому сделаю вывод о том, что причина использования таймера в его большей детализации.
PHPAPI int usleep(unsigned int useconds)
-
> "Вы, сударь, ерунду говорите. И хуже всего то, что говорите
> безапеляционно и уверенно"
У меня были хорошие учителя, которые никогда не ошибаются. ;-)
-
> DayGaykin © (31.03.16 11:08) [10]
>
> По поводу первого аргумента: "малый интервал" - это примерно
> 50 дней. Не слишком накладно поднимать из подкачки код раз
> в 50 дней.
Ты тоже ничего не понял. В версии со Sleep у тебя не написано Sleep(50 дней). Нормальные люди же не пишут Sleep(50 дней)? Или я ошибаюсь?
Там написано Sleep(несколько секунд или того меньше) и этот Sleep засунут в цикл. Соответственно поток этот будет просыпаться много-много раз за эти 50 дней за каким то лешим, хотя мог бы спокойно себе спать 50 дней и быть выгруженным. В варианте с таймером поток спит ровно 50 дней.
Вообще глупость ждать 50 дней, что таймером, что слипом.
> Поэтому сделаю вывод о том, что причина использования таймера
> в его большей детализации.
>
Ну не особенно большая.
Под Windows есть способ выдерживать точность вплоть до наносекунд, но ценой полной загрузки одного ядра.
-
> Нормальные люди же не пишут Sleep(50 дней)? Или я ошибаюсь?
Нормальные люди применят немного математики.
-
> [13] DayGaykin © (31.03.16 16:23)
> Нормальные люди применят немного математики
Расскажешь подробнее?
-
> Расскажешь подробнее?
Зачем? Троллей кормить?
-
> [15] DayGaykin © (31.03.16 17:44)
А кто здесь тролли? Вроде бы внятно объяснили разницу. Sleep() не предназначена для выдержки интервалов времени вооще-то. Откуда такое желание её прикрутить для этих целей.
-
> Inovet © (31.03.16 17:47) [16]
> Sleep() не предназначена для выдержки интервалов времени вооще-то.
Предназначен, если нет время ожидания прервать по внешнему событию.
Если надо точно заснуть на все 50 дней - то слип подходящее решение.
-
> KSergey © (01.04.16 10:08) [17]
> Если надо точно заснуть на все 50 дней - то слип подходящее
> решение.
И как мы программу прерывать будем со слипом на 50 дней? Или будем крутить слип в цикле с маленьким интервалом?
-
Прочитайте внимательно.
По условиям задачи нам надо заснуть ан все 50 дней без прерывания сна.
Что еще вас беспокоит?