реализовать время задержки в с - PullRequest
29 голосов
/ 14 октября 2010

Я не знаю точно, как сформулировать поиск для этого ... так что мне не повезло найти что-нибудь ..: S

Мне нужно ввести задержку в C.

например, я хочу кое-что сделать, затем подождать, скажем, 1 минуту, а затем продолжить работу.

Это имело смысл?Кто-нибудь может мне помочь?

Ответы [ 14 ]

0 голосов
/ 31 октября 2013
system("timeout /t 60"); // waits 60s. this is only for windows vista,7,8
system("ping -n 60 127.0.0.1 >nul"); // waits 60s. for all windows
0 голосов
/ 18 февраля 2011

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

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

Поэтому на практике я обнаружил, что вы на самом деле делаете ожидание события или условной переменной с таймаутом.

В Windows ваш звонок WaitForSingleObject.В POSIX это pthread_cond_timedwait.

В Windows вы также можете использовать WaitForSingleObjectEx, а затем вы можете «прервать» ваш поток с помощью любой задачи, поставленной в очередь, вызвав QueueUserAPC.WaitForSingleObject (Ex) вернет код, определяющий причину его выхода, поэтому вы будете знать, когда он вернет состояние «TIMEDOUT», что он действительно сделал тайм-аут.Вы устанавливаете ожидаемое событие, когда хотите, чтобы оно завершилось.

С помощью pthread_cond_timedwait вы можете передать широковещательную переменную условия.(Если несколько потоков ожидают одного и того же, вам нужно будет транслировать, чтобы разбудить их всех).Каждый раз, когда он зацикливается, он должен проверить состояние.Ваш поток может получить текущее время и посмотреть, прошло ли оно, или он может посмотреть, было ли выполнено какое-то условие, чтобы определить, что делать.Если у вас есть какая-то очередь, вы можете проверить это.(Ваш поток автоматически заблокирует мьютекс, который он использовал для ожидания условной переменной, поэтому, когда он проверяет условие, он имеет к нему единственный доступ).

0 голосов
/ 14 октября 2010

Вы можете просто вызвать функцию delay ().Поэтому, если вы хотите отложить процесс на 3 секунды, задержите вызов (3000) ...

0 голосов
/ 14 октября 2010

Это timer?

Для WIN32 попробуйте http://msdn.microsoft.com/en-us/library/ms687012%28VS.85%29.aspx

...