Как сделать задержку в c
Перейти к содержимому

Как сделать задержку в c

Thread. Sleep Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Приостанавливает текущий поток на заданное время.

Перегрузки

Приостанавливает текущий поток на заданное количество миллисекунд.

Приостанавливает текущий поток на заданное время.

Sleep(Int32)

Приостанавливает текущий поток на заданное количество миллисекунд.

Параметры

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

Исключения

Значение времени ожидания является отрицательной величиной и не равно Infinite.

Примеры

В следующем примере метод используется Sleep для блокировки основного потока приложения.

Комментарии

Поток не будет запланирован на выполнение операционной системой в течение указанного времени. Этот метод изменяет состояние включаемого WaitSleepJoinпотока.

Параметр можно указать Timeout.Infinite для приостановки millisecondsTimeout потока на неопределенный срок. Однако рекомендуется использовать другие System.Threading классы, такие как Mutex, Monitorили EventWaitHandleSemaphore вместо этого для синхронизации потоков или управления ресурсами.

Системные часы тикают по определенной частоте, называемой разрешением часов. Фактическое время ожидания может не совпадать с заданным временем ожидания, так как указанное время ожидания будет скорректировано так, чтобы оно совпадало с тактовыми часами. Дополнительные сведения о разрешении часов и времени ожидания см. в функции спящего режима из Windows системных API.

Этот метод не выполняет стандартную перекачку COM и SendMessage.

Если требуется спящий режим в потоке STAThreadAttribute, но вы хотите выполнить стандартное перекачки COM и SendMessage, рассмотрите возможность использования одной из перегрузок Join метода, задающего интервал времени ожидания.

Как организовать задержку выполнения программы в C

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 11 человек(а).

Количество просмотров этой статьи: 24 485.

Вы когда-нибудь хотели создать программу на C, которая выжидает определенное время? Вы можете настроить способ, чтобы дать времени «пролететь», например: при показе всплывающей страницы (уведомление или подсказка) для игры. . ОК, вот несколько способов создания программы вида «stand still» (стоять на месте), читайте дальше .

реализовать временную задержку в c

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

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

18 ответы

В стандартном C (C99) вы можете использовать time() для этого что-то вроде:

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

Чтобы уточнить, это только способ, которым я знаю, как сделать это с ISO C99 (и вопрос помечен не более чем «C», что обычно означает, что портативные решения желательны, хотя, конечно, решения для конкретных поставщиков все еще могут быть предоставлены).

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

Любая приличная ОС с временным разделением могла бы сбросить динамический приоритет задачи, которая постоянно использует свой полный временной интервал, но заряд батареи может быть более проблематичным.

Однако C указывает ничего о деталях ОС в размещенной среде, и этот ответ касается только ISO C и ISO C (так что использование sleep , select , Вызовы Win32 API или что-то в этом роде).

И имейте в виду, что POSIX sleep могут прерываться сигналами. если ты Он собираясь пойти по этому пути, вам нужно сделать что-то вроде:

ответ дан 14 апр.

Да, загрузка ЦП будет, но любая приличная ОС (при условии упреждающей многозадачности) обнаружит это и соответственно сбросит динамический приоритет. И, если это не так, загрузка процессора не имеет значения (если он работает в многозадачном режиме, вы можете захотеть изучить yield функция). Причина, по которой я опубликовал это, заключается в том, что нет переносимого способа ISO-C для этого, и вопрос помечен только «C» ( sleep , хотя и полезен, это не стандарт). — Paxdiablo

@paxdiablo: Нет, вообще-то не будет . Тактовая частота одного из процессоров вырастет до 100%. И нагрузка на ЦП имеет значение, особенно если вы используете ноутбук, когда ЦП загружен до максимума, он выделяет тепло, а нагрев сокращает срок службы компьютеров. На старом стационарном устройстве это, вероятно, не имеет значения, это то, как окна обрабатывают это (бесконечный цикл, который ничего не делает, когда нет указания делать). Я предполагаю, что сегодня в операционных системах используются передовые технологии энергосбережения, но я знаю, что ядро ​​Linux выдало инструкцию hlt, как и я, когда мне было 12 лет. Фрэнк

sleep (sec), по-видимому, является стандартом ISO / IEC 9945-1: 1990 (POSIX 1), это просто Microsoft делает свое дело, в то время как остальной мир делает один способ . — Фрэнк

@Frank, если вы говорите, что динамический приоритет Windows не будет изменен, вы ошибаетесь. Потоки, которые добровольно отказываются от ЦП, имеют повышенные динамические приоритеты. У тех, кто был вытеснен после использования всего своего временного отрезка, их приоритеты снижаются (хотя и не ниже их базового уровня, из памяти). Это будет иметь тенденцию отдавать предпочтение приложениям с хорошим поведением по сравнению с другими. Вы правы в том, что он по-прежнему будет потреблять процессор, но опять же, если вы используете ОС, которая позволяет sleep чтобы поместить ваш процесс в очередь ожидания (и останавливает ЦП, когда выполняется только незанятая задача), используйте его. Это все еще нестандартно. — Paxdiablo

@ Фрэнк, я думаю volatile sig_atomic_t finishing — правильное объявление переменной, совместно используемой обработчиком сигнала и основным потоком. Я просто хотел указать, что часто есть внешние требования, которые необходимо соблюдать . — РБертейг

Вот как это можно сделать на большинстве настольных систем:

Вот как это можно сделать на микрокомпьютере / процессоре без таймера:

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

ответ дан 14 окт ’10, 09:10

+1, чтобы компенсировать незаслуженный голос против ИМХО. С другой стороны, вы явно предполагаете, что ОС с полезными системными вызовами, и в фактическом вопросе упоминается только стандарт C, в котором, как указывает Pax, отсутствует какой-либо вызов задержки. Очень большой объем кода C работает на платформах без операционных систем. Хотя какой-то механизм похож на sleep() часто полезно создавать на таких платформах, это не требуется ни одним из стандартов C. — РБертейг

Я думал о том, чтобы написать, как это сделать на микропроцессорах без ОС, но не совсем почувствовал. Не совсем моя область. — Фрэнк

@Frank, Даже без ОС у вас часто есть счетчик, реализованный на оборудовании, который считает циклы некоторых часов. Таким образом, один из способов — прочитать этот счетчик, предсказать будущее значение и вращаться в цикле, пока счетчик не достигнет значения. Это работает для достаточно коротких периодов ожидания, чтобы счетчик не оборачивался более одного раза во время ожидания. В небольших процессорах иногда приходится прибегать к настраиваемым вручную циклам, когда вы точно знаете, сколько циклов потребляется на итерацию. Всегда есть выход, но он может быть не очень красивым. — РБертейг

Точнее, это не всегда может быть красиво. Но я удивился, разве нет микрокомпьютеров, на которых можно было бы установить прерывание и выдать hlt для экономии энергии? — Фрэнк

@Frank: у некоторых он есть. Например, PIC32MX имеет 2 типа таймеров. Тип A имеет свой собственный осциллятор, а тип B — нет. Оба позволяют выбрать предварительный делитель. — Jweyrich

ответ дан 14 окт ’10, 06:10

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

difftime гарантируется Стандарт C вернуть разницу во времени в секунды между двумя time_t ценности. Таким образом, мы можем написать переносимую функцию задержки времени, которая будет работать во всех совместимых реализациях Стандарт C.

Одно предостережение с time и difftime функции заключается в том, что Стандарт C никогда не указывает степень детализации. Большинство реализаций имеют степень детализации секундочку. Хотя это нормально для длительных задержек несколько секунд, наша функция задержки может ждать слишком долго для продолжающихся задержек. менее одной секунды.

Существует переносимая стандартная альтернатива C: clock функции.

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

clock функциональное решение очень похоже на наше time функциональное решение:

В этом случае есть предостережение, аналогичное time и difftime : степень детализации clock функция остается на усмотрение реализации. Например, машины с 32-битными значениями для clock_t с разрешением в микросекунд может закончиться тем, что значение, возвращаемое clock через 2147 секунд (около 36 минут).

Таким образом, рассмотрите возможность использования time и difftime реализация функции задержки для длительных задержек хотя бы одну секунду, А clock реализация для длительных задержек менее одной секунды.

Последнее предостережение: clock Возвращает процессорное время а не календарное время; clock может не соответствовать фактическому истекшему времени (например, если процесс находится в спящем режиме).

При задержке до одной минуты sleep() хороший выбор

Если когда-нибудь вы захотите приостановить задержку менее одной секунды, вы можете рассмотреть poll() с таймаутом.

Оба являются POSIX.

ответ дан 14 окт ’10, 09:10

Пытаться sleep(int number_of_seconds)

ответ дан 14 окт ’10, 06:10

sleep(int) работает как хорошая задержка. На минуту:

ответ дан 14 окт ’10, 06:10

Нет sleep() функции в стандартной библиотеке C до C11, но POSIX предоставляет несколько вариантов.

Функция POSIX sleep() (unistd.h) занимает unsigned int аргумент количества секунд, в течение которых нужно спать. Хотя это не функция стандартной библиотеки, она широко доступна, и glibc, похоже, поддерживает ее даже при компиляции с более строгими настройками, такими как —std=c11 .

Функция POSIX nanosleep() (time.h) принимает два указателя на timespec структуры в качестве аргументов и обеспечивает более точный контроль над продолжительностью сна. Первый аргумент указывает продолжительность задержки. Если второй аргумент не является нулевым указателем, он содержит оставшееся время, если вызов прерывается обработчиком сигнала.

Программы, использующие nanosleep() функция, возможно, потребуется включить макрос проверки функций чтобы скомпилировать. Следующий пример кода не будет компилироваться в моей системе Linux без макроса тестирования функций, когда я использую типичный вызов компилятора gcc -std=c11 -Wall -Wextra -Wpedantic .

POSIX когда-то usleep() функция (unistd.h), которая приняла useconds_t аргумент для указания продолжительности сна в микросекундах. Для этой функции также требовался макрос проверки функций при использовании со строгими настройками компилятора. Увы, usleep() устарел с POSIX.1-2001 и больше не должен использоваться. Рекомендуется, чтобы nanosleep() использоваться сейчас вместо usleep() .

Приложение:

C11 имеет заголовок threads.h обеспечение thrd_sleep() , который работает идентично nanosleep() . GCC не поддерживает threads.h до 2018 года с выпуском glibc 2.28. В целом было сложно найти реализации с поддержкой threads.h (Clang давно его не поддерживал, но я не уверен в текущем положении дел там). Вам нужно будет использовать эту опцию с осторожностью.

ответ дан 14 окт ’10, 06:10

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

ответ дан 14 окт ’10, 08:10

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *