FreeBasic - проблема со Sleep()
|
|
martuk | Дата: Понедельник, 04 Января 2016, 18:49 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| У меня проблема с разновидностью диалекта basic - FreeBasic
В общем, вчера (а это было вчера) я работал с командами Sleep() и Timer(), засекал работу команды sleep(). Все работало идеально!
Вот код:
Код
timer2 = Timer() ' Засекаю начальную точку времени Sleep(17) ' Засыпаем на 17 ms tim1 = (Timer()-timer2)*1000 ' Считаю сколько прошло времени на самом деле.
Так вот, кульминация еще впереди! В переменную tim1 оно кидало верное значение 17! (Погрешность + - 0.1, но это не важно)
Проблема дня: Запускаю тот же самый код, и вы не поверите но он нещадно грешит со ответом!
Вот стата:
- Засыпаю на 15 ms, а на самом деле заснули на 30 ms - Засыпаю на 30 ms, а на самом деле заснули на 45 ms - Засыпаю на 1000 ms, а на самом деле заснули на 1255 ms
!!!! - Засыпаю на 1 ms, а на самом деле заснули на 15 - 16 ms - вот это sleep просто жгёт)
В чем отличие? по мне так это магнитные бури мешают нормально работать sleep(). Читал в ваших интернетах, что sleep способен грешить, но оправдывалось это вызовом функции и перехода к timer() но это жалкие 0.1 - 0.2 ms, что не очень то важно.
В чем проблема? Или меня компьютер разлюбил? :'(
Добавлено (04 января 2016, 18:49) --------------------------------------------- UPDATE Вообще при подстановке значения для Sleep() в диапазоне от 8 до 18, он засыпает ровно на 30 ms. если заснуть на 5 - то в реале на 14
Сообщение отредактировал martuk - Понедельник, 04 Января 2016, 18:50 |
|
| |
YellowAfterlife | Дата: Понедельник, 04 Января 2016, 19:00 | Сообщение # 2 |
Сейчас нет на сайте
| Sleep не гарантирует паузу на точно указанное время. "Проспанное" время может быть немного больше или меньше, поскольку возобновление работы потока полностью на совести операционной системы. Обычно время ожидание "округляется" в сторону ближайшего множителя точности системного таймера (обычно 16мс, но у тебя 15?). Если нужна большая точность при ожидании, обычно это достигается смесью sleep и цикла, "замораживающего" поток на последние <16мс.
|
|
| |
martuk | Дата: Понедельник, 04 Января 2016, 19:31 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| YellowAfterlife, Спасибо за ответ, но вопрос не раскрыт до конца!
Цитата YellowAfterlife ( ) Если нужна большая точность при ожидании, обычно это достигается смесью sleep и цикла Это уже использовалось, и работало! Но во время простоя процессорное время только и делает, что крутит цикл а это грузит все 1 ядро. Жрет 50% процессора! Но это недопустимо. Sleep же работал идеально вчера! Серьезные "Округления" появились уже сегодня. Это печаль-беда, придется выкручиваться.
Соль в том, что в одном из 10 запусков приложения, sleep работает очень хорошо, так же как вчера. Было быть, это как ядру windows захочется так и будет распределять в память мою программу, ставя на очереди более нужные вещи( От этого и задержка sleep.
Цитата но вопрос не раскрыт до конца! Наверно уже раскрыт.
Добавлено (04 января 2016, 19:29) --------------------------------------------- Опа, заметил: Если долго держать приложение (2-3 минуты после запуска) Он перестает грешить и засыпает на нужное количество ms. Тайна покрытая мраком.
Добавлено (04 января 2016, 19:31) --------------------------------------------- Ха, теперь вообще при любом запуске, sleep() работает идеально ровно. Надо записать в книжечку наблюдения.
Сообщение отредактировал martuk - Понедельник, 04 Января 2016, 19:31 |
|
| |
PBPROG | Дата: Пятница, 08 Января 2016, 21:00 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Может баг FreeBasic. В другом диалекте бейсика - PureBasic такой проблемы нет и задержка именно такая как должна быть.Код Time = ElapsedMilliseconds() Delay(8) MessageRequester("", Str(ElapsedMilliseconds()-Time))
|
|
| |
OpenGOO | Дата: Пятница, 08 Января 2016, 22:48 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| Для винды вот описание работы [url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx]Sleep function[/url]
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |