2012-01-31 4 views
0

Я занимаюсь начинающим программистом на C++, основанным на игре.Я попытался придумать альтернативу кросс-платформе для сна(), но мой код не совсем работает

Когда я вывожу объекты карты на консоль, из-за скорости обработки компьютеров, естественно, отображается только весь список карт, которые были обработаны. Я подумал, что было бы неплохо, если бы я мог сделать паузу между каждой карточной сделкой, чтобы человек действительно мог наблюдать за каждой раздаваемой карточкой. Так как я буду всегда работать как на Linux и Windows, и уже < CTIME> включен я пришел с этим небольшим раствором:

for(;;){ 
      if((difftime(time(0),lastDealTime)) > 0.5f){ //half second passed 
       cout << currentCard <<endl; 
       lastDealTime = time(0); 
       break; 
      } 
     } 

В первом я думал, он работал, но потом, когда я пытался ускорить дилинговую процесс позже я понял, что изменение контрольного значения 0,5 (я нацелился на карточную сделку каждые полсекунды), похоже, не имел никакого эффекта. Я попытался изменить его на каждые 0,05 секунды, и это не имело никакого значения, карты все еще, казалось, выводились каждую секунду, я бы догадался.

Любые замечания относительно того, почему это не сработает? Благодаря!

+2

В качестве альтернативы, ваша реализация - это занятая точка, означающая, что программа будет вращаться и использовать все ресурсы ЦП, которые она может получить, пока она ждет, потенциально замедляя все остальное. Вот почему вы должны использовать сон в какой-то форме. – Supr

+0

Право спасибо за информацию, я запомню это :) – Holly

+0

См. Http://en.wikipedia.org/wiki/Busy_waiting кстати :) – Supr

ответ

1

time() и difftime() имеют разрешение секунды, чтобы не было способ использовать их для управления интервалами менее секунды; даже для интервалов в секунду, они не могут использоваться, так как дрожание может быть до секунд.

В этом случае решение состоит в том, чтобы определить какой-то тип таймера с системным независимым интерфейсом в файле заголовка, но в системных зависимых исходных файлах; в зависимости от системы, вы компилируете один исходный файл или другой. У Windows и Linux есть способы управления временем с более высоким разрешением .

2

Разрешение time() составляет одну секунду, то есть возвращаемое значение представляет собой целое число секунд. Вы никогда не увидите разницу менее секунды.

usleep() находится в стандартной библиотеке C - он имеет разрешение в микросекундах, поэтому используйте это вместо этого.

+0

ах, я вижу, как глупо меня! У меня создалось впечатление, что usleep() не будет работать на машине с Windows. Спасибо за информацию! – Holly

+1

@Holly 'usleep()' не будет работать на Windows, я думаю. Существует 'Sleep()' (разрешение системного таймера, около 15 миллисекунд), и вы можете увеличить его с помощью 'timeBeginPeriod()'. – lapk

+1

'usleep' - стандартная функция POSIX, а не часть стандартной библиотеки C. Стандартная библиотека C вообще не касается потоков. –

1

Если вы хотите убедиться, что карты имеют дело с точным интервалом, который вы запрашиваете, вам также следует создать класс таймера. Мы используем:

В Windows использовать QueryPerformanceFrequency, чтобы получить время системы клеща и QueryPerformanceCounter, чтобы получить тики

В Mac Carbon использовать DurationToAbsolute, чтобы получить время системы клеща и UpTime, чтобы получить тики.

В Linux используется clock_gettime.

Для использования сна:

Windows-использование Sleep();

На Mac Использование углерода MPDelayUntil();

В Linux используется nanosleep();

1

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

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