Что самый простой путь состоит в том, чтобы записать таймеру в C/C++?

Добавить ответ на мой собственный вопрос:

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

я говорю от личного опыта. (спасибо pigsback!) Они представили подтверждение по мобильному телефону. Это остановило меня имеющий 2 учетных записи!:-)

5
задан Secko 8 July 2009 в 19:36
поделиться

14 ответов

Лучше всего использовать примитив операционной системы, который приостанавливает программу на определенное время (например, Sleep () в Windows). Среда, в которой будет выполняться программа, скорее всего, будет иметь какой-то механизм для выполнения этого или подобного. Это единственный способ избежать опроса и использования процессорного времени.

9
ответ дан 18 December 2019 в 06:36
поделиться

Есть два способа:

Один. Напишите свой собственный таймер, который является оболочкой для конкретной команды платформы. И продолжайте использовать это. например,

void MySleep::Sleep(int milliSec)
{
#ifdef WIN32
   sleep(milliSec) ;
#else
#ifdef LINUX
   usleep(milliSec*1000); //microseconds
#endif
#endif
}

Два. Выберите библиотеки и наборы инструментов, которые поддерживают все ваши целевые платформы. Наборы инструментов, такие как Qt и boost, могут использоваться для прикрытия специфической для платформы goo.

И boost, и Qt имеют таймеры с высокой функциональностью и расширяемы. Я рекомендую вам поискать их.

3
ответ дан 18 December 2019 в 06:36
поделиться

Написанный вами код не компилируется. Я сделал несколько «предположений» о том, что вы хотели сделать, и изменил код.

Подводя итог, вы можете вызвать правильную функцию, явно указав тип параметра функции:

connect<double> (&GApp::foo);

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

template <typename T> class A
{
public:
  template<class Arg1>
  void connect(void (T::*f)(Arg1)) 
  {
    //Do some stuff
  }

  void connect(void (T::*f)()) 
  {
    //Do some stuff
  }
};

class GApp
{
public:
    void foo() {}
    void foo(double d) {}
};


int main ()
{
  A<GApp> a;
  a.connect (&GApp::foo);            // foo ()
  a.connect<double> (&GApp::foo);    // foo (double)
}

UPDATE:

В ответ на новый образец кода вся информация передается. «Редким» случаем является 'signal_void ', поскольку здесь сигнал имеет аргумент шаблона, а функция-член - нет. Поэтому мы рассматриваем этот пример отдельно, и на этом все готово. Теперь компилируется следующее:

5
ответ дан 18 December 2019 в 06:36
поделиться

http://linux.die.net/man/2/alarm

Description:
alarm() arranges for a SIGALRM signal to be delivered to the process in seconds seconds.

and use cygwin on windows.

2
ответ дан 18 December 2019 в 06:36
поделиться

используют функцию сна .. и указатель функции

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

Edit , сделайте то, что предлагает smallduck. использование макросов для текущего вызова соответствующего вызова операционной системы (если вы не хотите использовать ускорение) ... с использованием чего-либо еще, тогда таймер не будет точным.

1
ответ дан 18 December 2019 в 06:36
поделиться

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

1
ответ дан 18 December 2019 в 06:36
поделиться

То, что вы уже делаете, самое простое.

Это потребляет слишком много ресурсов ЦП, потому что вам сложно выполнить вашу проверку (истек ли таймер?) или что-то в этом роде.

Чтобы исправить это, поместите usleep (1) или другой эквивалент OS очень короткого сна в этом основном петля, и у вас будет то, что вам нужно.

2
ответ дан 18 December 2019 в 06:36
поделиться

Многие из этих ответов включают что-то, известное как «занятое ожидание». Проверять время снова и снова в цикле while () - плохая идея в 99% случаев.

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

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

Итак, у вас есть несколько вариантов. Вы можете время от времени «будить» свою фоновую программу и проверять выполнение условий (используя sleep / usleep, которые являются стандартными функциями на всех языках во всех операционных системах).

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

Трудно сказать, что именно вы хотите, потому что трудно сказать, как выполняются ваши условия ожидания / выключения и как они запускаются.

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

Для этого вы также можете легко использовать сеть / сокеты. Слушайте интерфейс обратной связи (127.0.0.1) и предварительно определенный порт. Теперь подождите, пока данные не поступят в этот сокет. Когда монитору батареи необходимо перейти в режим ожидания, он отправляет простое сообщение через шлейф в ваш новый процесс. Это будет эффективно использовать 0 ЦП.

Вероятно, есть и другие способы,

1
ответ дан 18 December 2019 в 06:36
поделиться

Вы всегда можете поиграться с потоками. Один главный поток может планировать задачи / задания, которые должны выполняться через определенные промежутки времени. Но затем мы переходим к планированию, что и делает ОС. Итак, как сказал GMan, вы внезапно оказываетесь в сфере разработки собственной ОС или имитации частей функциональности ОС.

0
ответ дан 18 December 2019 в 06:36
поделиться
  void SimpleTimer (int timeinterval)
 {
 int время начала, текущее время, разница;
 время начала = время (ноль);

 делать
 {
 текущее время = время (ноль); 
 разница = текущее время - время начала;
 }
 while (разница <интервал времени);
 }
-2
ответ дан 18 December 2019 в 06:36
поделиться

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

0
ответ дан 18 December 2019 в 06:36
поделиться

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

0
ответ дан 18 December 2019 в 06:36
поделиться

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

проблема с таймерами в том, что если вам нужен хороший таймер, вам может потребоваться выйти за рамки c ++ ( / c) в область вызовов ОС, из-за чего вы в конечном итоге получаете решение для конкретной ОС или используете какую-то библиотеку, например boost, чтобы обернуть его.

Я в основном программирую в Windows, поэтому мой совет исходит из этой области:

В Windows вы, конечно, можете использовать таймер (NULL), как некоторые предлагали, но в основном, когда вы ждете, вы не хотите, чтобы блог загружал процессор с помощью цикла. Использование сна - это один из способов, но вместо этого я обычно использую объект для ожидания. Либо объект сигнализирует, либо происходит тайм-аут. Например, чтобы подождать 10 секунд:

res = WaitForSingleObject( someobjecthandle, 10000 );

, если возвращаемое значение - тайм-аут, я знаю, что ждал 10 секунд, иначе объект каким-то образом сигнализировал, а я этого не сделал. Жду 10 секунд. Теперь, используя это, вы можете создать эффективный таймер.

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

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

Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)

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

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

Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)

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

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

Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)

1
ответ дан 18 December 2019 в 06:36
поделиться

Вы можете вызывать time () несколько раз и сравнивать значения.

#include <time.h>

int main ()
{
  time_t start_time;
  time_t current_time;

  start_time = time(NULL);
  current_time = time(NULL)

  while (current_time < start_time + TIMEOUT)
  {
  /* Do what you want while you're waiting for the timeout */
  current_time = time(NULL);
  }

 ...
}

Преимущество перед sleep () состоит в том, что вы все еще можете выполнять код во время ожидания. Например ... запрос внешнего сигнала остановки и т. Д.

1
ответ дан 18 December 2019 в 06:36
поделиться