ScreenLock
 
Блокирует рабочую страницу фреймбуфера

Синтаксис

Declare Sub ScreenLock ( )

Использование

ScreenLock

Описание


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

Функция ScreenLock блокирует автоматическое обновление, поэтому несколько операций рисования могут быть сделаны перед обновлением экрана, тем самым увеличивая скорость исполнения и предотвращая мерцание экрана.

Память буфера кадра может быть свободно доступна с помощью указателей (см. ScreenPtr) ТОЛЬКО тогда, когда экран заблокирован. Операторы примитивной графики (Line, PSet, Draw String, ...) могут использоваться в любое время.

Обновление экрана остается заблокированным до использования оператора ScreenUnlock , который используется для разблокировки.

Вызовы ScreenLock должны быть в паре с соответствующим вызовом ScreenUnlock. Графический драйвер сохраняет сколько раз ScreenLock была вызвана с помощью счетчика. Только первый вызов ScreenLock на самом деле выполняет операцию блокировки. Последующие вызовы ScreenLock только увеличивают счетчик блокировки. И наоборот, ScreenUnlock только уменьшает счетчик блокировки, пока он не достигнет нуля,  в это время будет выполняться фактическая процедура разблокировки. Использование Screen или ScreenRes обнуляет все блокировки и устанавливает счетчик блокировки на ноль перед изменением режимов экрана.

Настоятельно рекомендуется, чтобы блокировка страницы проводилась (как только можно) за короткое время. Только рисование на экране должно происходить во время блокировки экрана, ввод и вывод, а так же ожидание с помощью Sleep следует избегать. В Win32 и Linux заблокированный экран, останавливает поток, который обрабатывает также OS события. Если экран блокируется долгое время , в очереди событий может произойти переполнение и это сделает систему нестабильной. Если время блокировки становится слишком длинным, лучше используйте метод двойной буферизации (с ScreenCopy).

Автоматическое обновление происходит только в видимой странице фреймбуфера. ScreenLock не действует, когда рисунок на странице не виден.

Пример


'' Рисует круг на экране рядом с курсором мыши
Dim As Integer mx, my
Dim As String key

ScreenRes 640, 480, 32

Do

  'процесс
  GetMouse(mx, my)
  key = Inkey()

  'рисуем
  ScreenLock()
  Cls()
  Circle (mx, my), 8, RGB(255, 255, 255)
  ScreenUnlock()

  'освободить процессорное время
  Sleep(18, 1)
  
Loop Until key = Chr(27) Or key = Chr(255, 107)


Различия платформ

  • В DOS, стрелка мыши не реагирует на движения мыши во время блокировки экрана

Различия диалектов

  • Не доступно в диалекте -lang qb , но есть псевдоним __Screenlock.

Отличия от QB

  • Новое в FreeBASIC

См. также