В чем разница между Pause (), Sleep () и Wait () в C ++? - PullRequest
4 голосов
/ 15 мая 2011

Я работал по курсу CS106B из Стэнфорда, и, выполняя задание Boggle, я заметил, что функция Sleep () в Windows ведет себя иначе, чем функция Pause ().В целях тестирования я просто настроил плату и использовал предоставленный файл gboggle.h, чтобы выделить кубы Boggle, а затем убрать выделение.Ниже приведен соответствующий код:

for(int row = 0; row < board.numRows(); row++)
{
    for(int col = 0; col < board.numCols(); col++)
    {
        HighlightCube(row, col, true);
    }
}

Pause(0.5);

for(int row = 0; row < board.numRows(); row++)
{
    for(int col = 0; col < board.numCols(); col++)
    {
        HighlightCube(row, col, false);
    }
}

Если я использую Pause (), кубики подсвечиваются, а затем возвращаются в нормальное состояние.Если я использую Sleep () или Wait (), кубы никогда не подсвечиваются, и задержка в программе происходит еще до того, как доска нарисована, а не между циклами for.Соответствующая функция Wait ():

void wait ( int seconds )
{
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}
}

взята из здесь .Я использую Visual Studio 2005 в Windows XP.

Какая разница между этими функциями заставляет их действовать таким образом?

Редактировать: Мне известно, что для сна и ожидания требуются целые числа.Я проверил их, используя целые числа, и вижу задержку, но это происходит до того, как будут написаны квадраты.Извините, что раньше я не понимал этого.

Edit2: просмотрев некоторые другие библиотеки, которые я использовал, я обнаружил, что Pause, фактически, является частью графической библиотеки, которая просто приостанавливает графический буфер.

Ответы [ 3 ]

5 голосов
/ 15 мая 2011

Sleep хочет целое число в виде миллисекунд, а вы даете ему 0,5, так что вы ждете 0 миллисекунд. Ваша функция ожидания также принимает целые числа, поэтому у нее та же проблема.

Также ваша функция ожидания блокируется. Пока вы ждете, ваше приложение занято и использует процессор для ожидания. Принимая во внимание, что функция Windows Sleep приостанавливает текущий поток, что означает, что ваше приложение действительно ничего не делает (не использует ресурсы ЦП), пока время не закончится.

РЕДАКТИРОВАТЬ: Я не знаю, что делает Пауза, поскольку это не функция WinAPI.

EDIT: Может случиться так, что результаты HighlightCube сначала будут видны, когда приложение вернется в цикл обработки событий, а затем эти кубы будут нарисованы. Таким образом, вы просто выделяете их, затем ждете, а затем не выделяете их. Затем ваша функция возвращается и приложение, наконец, рисует их. Это совершенно очевидно, так как Sleep (а также ваше ожидание) просто блокируют приложение от обработки каких-либо событий (включая события рисования окна). Я полагаю, что Пауза предотвращает это, возвращаясь к циклу событий. На самом деле это то, что Грег Домян уже написал.

1 голос
/ 15 мая 2011

Я никогда раньше не видел команду Пауза;возможно, вы могли бы предоставить какой-то код для этого?

Приложения Windows работают на идее прокачки сообщений, а рисование имеет низкий приоритет.

Если вы спите или ждете в ветке прокачки сообщенийзатем вы блокируете его от дальнейшей обработки сообщений, таких как рисование экрана.

Вам нужно уступить насосу сообщений, чтобы он мог выполнять свою работу.

Вы можете посмотреть на использование Дождаться нескольких и запустить второй насос сообщений.(предполагая, что это тело Паузы).

0 голосов
/ 15 мая 2011

Поскольку wait принимает параметр типа int, вызов его с 0,5 (как в примере используется для Pause) приведет к усечению 0,5 до 0, поэтому вы не получите задержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...