Вторник, 08 Октября 2024, 21:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг