2015-07-21 2 views
3

Я хочу реализовать функцию задержки с использованием пулов нулей. Но время, необходимое для завершения цикла, является компилятором и зависит от машины. Я хочу, чтобы моя программа самостоятельно определяла время и задерживала программу на указанный промежуток времени. Может ли кто-нибудь дать мне представление, как это сделать? N. B. Существует функция с именем delay(), которая приостанавливает систему за указанные миллисекунды. Возможно ли приостановить работу системы без использования этой функции?Реализация функции задержки времени в C

+1

Функция delay() зависит от os и machine. Его не какая-то магическая функция языка C, это просто стандартный интерфейс, принятый либо ANSI, либо POSIX. Он должен быть реализован на уровне ядра для конкретного оборудования, что также означает (зависит от компилятора/машины). – alan7678

+1

Если вы не на уровне ядра программирования, то есть пользовательское приложение в unix, windows и т. Д., Зачем изобретать колесо? Если вы находитесь на уровне ядра, вам нужно знать аппаратное обеспечение о том, как использовать регистры с таймерами и т. Д. – alan7678

+1

Начиная с версии C11, в стандарте теперь предлагается интерфейс, который не зависит от ОС, 'thrd_sleep'. К сожалению, не все компиляторы реализуют это, но все же приходят. –

ответ

1

Вы можете сделать что-то вроде поиска точного времени, которое оно находится в определенный момент времени, а затем сохранить его в цикле while, который перечитывает время, пока оно не достигнет того, что вы хотите. Затем он просто вырывается и продолжает выполнять оставшуюся часть вашей программы. Я не уверен, что я вижу большую выгоду в цикле, а не только при использовании функции задержки.

+0

Функция деления() не работает в dev-c. –

2

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

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

Edit:

В Linux, вы можете получить текущее системное время с gettimeofday, которая имеет разрешение микросекунд (будь то фактические часы, что точная другая история). В Windows, вы можете сделать что-то подобное с GetSystemTimeAsFileTime:

int gettimeofday(struct timeval *tv, struct timezone *tz) 
{ 
    const unsigned __int64 epoch_diff = 11644473600000000; 
    unsigned __int64 tmp; 
    FILETIME t; 

    if (tv) { 
     GetSystemTimeAsFileTime(&t); 

     tmp = 0; 
     tmp |= t.dwHighDateTime; 
     tmp <<= 32; 
     tmp |= t.dwLowDateTime; 

     tmp /= 10; 
     tmp -= epoch_diff; 
     tv->tv_sec = (long)(tmp/1000000); 
     tv->tv_usec = (long)(tmp % 1000000); 
    } 

    return 0; 
} 
+0

Вы используете функцию time() для получения системного времени? –

+0

'gettimeofday (2)' устаревает с SUS v4; вы должны рекомендовать 'clock_gettime (2)'. –

+0

А также: использование системной функции для сна не обязательно более точная, чем сворачивание собственных. Как вы сказали, Linux не является оперативной системой реального времени, поэтому задержки могут (и будут) всегда происходить независимо от того, что. –

3

Прежде всего, вы должны никогда сидеть в цикле ничего не делая. Мало того, что это отработанная энергия (так как она держит ваш процессор на 100% занятой, подсчитывая ваш счетчик циклов) - в многозадачной системе это также снижает всю производительность системы, потому что ваш процесс получает временных отрезков все время по мере появления что-то делать.

Следующая точка ... Я не знаю delay() Функция. Это не стандарт C. На самом деле, до C11, для таких вещей не было никакого стандарта.

POSIX на помощь, есть usleep(3) (устаревший) и nanosleep(2). Если вы находитесь в POSIX-совместимой системе, с вами все будет в порядке. Они блок (означает, что планировщик вашей ОС знает, что им нечего делать и планирует их только после окончания вызова), поэтому вы не теряете процессорную мощность.

Если вы находитесь в окнах, для прямой задержки кода вы имеете только Sleep(). Обратите внимание, что эта функция занимает миллисекунды, но обычно имеет значение только около 15 мс. Часто достаточно хорошо, но не всегда. Если вам нужна более высокая точность в окнах, вы можете запросить больше прерываний таймера с помощью timeBeginPeriod() ... timeBeginPeriod(1); запросит прерывание таймера каждые миллисекунды. Не забудьте позвонить timeEndPeriod() с то же значение, как только вам больше не нужна точность, потому что больше прерываний таймера идет со стоимостью: они удерживают систему занятой, тем самым теряя больше энергии.

У меня была несколько схожая проблема с разработкой небольшой игры в последнее время, мне нужны постоянные тики через 10 мс, это то, что я придумал с for POSIX-compliant systems и for windows.Функция ticker_wait() в этом коде просто приостанавливается до следующего тика, возможно, это полезно, если ваше первоначальное намерение было связано с определением сроков.

Смежные вопросы