Я пытался придумать кроссплатформенную альтернативу sleep (), но мой код не совсем работает - PullRequest
0 голосов
/ 31 января 2012

Я делаю небольшую программу для начинающих на С ++, основанную на игре в оснастку.

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

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

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

Есть какие-нибудь наблюдения, почему это не сработает?Спасибо!

Ответы [ 4 ]

2 голосов
/ 31 января 2012

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

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

1 голос
/ 31 января 2012

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

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

1 голос
/ 31 января 2012

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

В Windows используем QueryPerformanceFrequency для получения системного времени и QueryPerformanceCounter для получения тиков

На Mac Carbon используйте DurationToAbsolute для получениясистемное время и UpTime для получения тиков.

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

Для режима сна:

Одна Windows использует Sleep ();

На Mac Carbon используйте MPDelayUntil ();

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

1 голос
/ 31 января 2012

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

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

...