Добавить ответ на мой собственный вопрос:
А различный способ сделать, который это, просит у пользователей их номер мобильного телефона, отправляет им текстовое сообщение за проверкой. Это останавливает большинство людей, смешивающих с дублирующимися адресами.
я говорю от личного опыта. (спасибо pigsback!) Они представили подтверждение по мобильному телефону. Это остановило меня имеющий 2 учетных записи!:-)
Лучше всего использовать примитив операционной системы, который приостанавливает программу на определенное время (например, Sleep () в Windows). Среда, в которой будет выполняться программа, скорее всего, будет иметь какой-то механизм для выполнения этого или подобного. Это единственный способ избежать опроса и использования процессорного времени.
Есть два способа:
Один. Напишите свой собственный таймер, который является оболочкой для конкретной команды платформы. И продолжайте использовать это. например,
void MySleep::Sleep(int milliSec)
{
#ifdef WIN32
sleep(milliSec) ;
#else
#ifdef LINUX
usleep(milliSec*1000); //microseconds
#endif
#endif
}
Два. Выберите библиотеки и наборы инструментов, которые поддерживают все ваши целевые платформы. Наборы инструментов, такие как Qt и boost, могут использоваться для прикрытия специфической для платформы goo.
И boost, и Qt имеют таймеры с высокой функциональностью и расширяемы. Я рекомендую вам поискать их.
Написанный вами код не компилируется. Я сделал несколько «предположений» о том, что вы хотели сделать, и изменил код.
Подводя итог, вы можете вызвать правильную функцию, явно указав тип параметра функции:
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 ', поскольку здесь сигнал имеет аргумент шаблона, а функция-член - нет. Поэтому мы рассматриваем этот пример отдельно, и на этом все готово. Теперь компилируется следующее:
http://linux.die.net/man/2/alarm
Description:
alarm() arranges for a SIGALRM signal to be delivered to the process inseconds
seconds.
and use cygwin on windows.
используют функцию сна .. и указатель функции
, использующий функцию сна, не потребляет процессорное время ... Вы можете использовать указатель функции, чтобы уведомить, когда истекло время таймера. если вам не нужны события, вы можете просто использовать функцию сна / задержки
Edit , сделайте то, что предлагает smallduck. использование макросов для текущего вызова соответствующего вызова операционной системы (если вы не хотите использовать ускорение) ... с использованием чего-либо еще, тогда таймер не будет точным.
Вы не упомянули среду, в которой вы встраиваете таймер. Например, микроконтроллеры обычно имеют блок таймера / счетчика, который через определенные промежутки времени вызывает прерывания, подсчитывая тактовые циклы, и вы можете просто обрабатывать их прерывания.
То, что вы уже делаете, самое простое.
Это потребляет слишком много ресурсов ЦП, потому что вам сложно выполнить вашу проверку (истек ли таймер?) или что-то в этом роде.
Чтобы исправить это, поместите usleep (1) или другой эквивалент OS очень короткого сна в этом основном петля, и у вас будет то, что вам нужно.
Многие из этих ответов включают что-то, известное как «занятое ожидание». Проверять время снова и снова в цикле while () - плохая идея в 99% случаев.
Я думаю, вы можете сделать шаг назад и подойти к проблеме немного иначе.
Похоже, вы хотите, чтобы программа что-то отключила при заданном наборе условий.
Итак, у вас есть несколько вариантов. Вы можете время от времени «будить» свою фоновую программу и проверять выполнение условий (используя sleep / usleep, которые являются стандартными функциями на всех языках во всех операционных системах).
Или вы можете фоновый процесс на неопределенное время, пока не произойдет какое-либо событие. Это, вероятно, лучше всего было бы сделать на C через сигналы или какую-либо функцию ожидания.
Трудно сказать, что именно вы хотите, потому что трудно сказать, как выполняются ваши условия ожидания / выключения и как они запускаются.
Вы можете захотеть, чтобы ваша программа монитора батареи выполняла какой-то тип IPC или, может быть, записывала какой-то фиктивный файл в известный каталог, когда он должен перейти в режим ожидания. С IPC вы можете использовать некоторый тип функции wait (), которая активируется, когда сигнал или IPC отправляются вашему фоновому процессу. С файловым методом вы можете sleep () и проверять наличие этих файлов при каждом пробуждении.
Для этого вы также можете легко использовать сеть / сокеты. Слушайте интерфейс обратной связи (127.0.0.1) и предварительно определенный порт. Теперь подождите, пока данные не поступят в этот сокет. Когда монитору батареи необходимо перейти в режим ожидания, он отправляет простое сообщение через шлейф в ваш новый процесс. Это будет эффективно использовать 0 ЦП.
Вероятно, есть и другие способы,
Вы всегда можете поиграться с потоками. Один главный поток может планировать задачи / задания, которые должны выполняться через определенные промежутки времени. Но затем мы переходим к планированию, что и делает ОС. Итак, как сказал GMan, вы внезапно оказываетесь в сфере разработки собственной ОС или имитации частей функциональности ОС.
void SimpleTimer (int timeinterval) { int время начала, текущее время, разница; время начала = время (ноль); делать { текущее время = время (ноль); разница = текущее время - время начала; } while (разница <интервал времени); }
Если вам нужно запустить несколько таймеров с одним потоком, то поддержание хэш-таблицы, содержащей активные таймеры, является очень хорошим методом. Вы используете время истечения срока для формирования хеш-ключа. После каждого тика таймера вы затем ищите в хеш-таблице таймеры, срок действия которых истек.
Если все, что вам нужно, это фрагмент кода, который позволяет вашей программе отдыхать, достаточно вызова засыпания (если вы согласны со второй степенью детализации).
это нетривиальная задача, потому что в зависимости от ваших требований она может быть довольно сложной.
проблема с таймерами в том, что если вам нужен хороший таймер, вам может потребоваться выйти за рамки c ++ ( / c) в область вызовов ОС, из-за чего вы в конечном итоге получаете решение для конкретной ОС или используете какую-то библиотеку, например boost, чтобы обернуть его.
Я в основном программирую в Windows, поэтому мой совет исходит из этой области:
В Windows вы, конечно, можете использовать таймер (NULL), как некоторые предлагали, но в основном, когда вы ждете, вы не хотите, чтобы блог загружал процессор с помощью цикла. Использование сна - это один из способов, но вместо этого я обычно использую объект для ожидания. Либо объект сигнализирует, либо происходит тайм-аут. Например, чтобы подождать 10 секунд:
res = WaitForSingleObject( someobjecthandle, 10000 );
, если возвращаемое значение - тайм-аут, я знаю, что ждал 10 секунд, иначе объект каким-то образом сигнализировал, а я этого не сделал. Жду 10 секунд. Теперь, используя это, вы можете создать эффективный таймер.
Другой подход, который требует немного больше работы, - это создать отдельный поток таймера (снова окна), который периодически отправляет сообщение в ваш цикл сообщений.
Третий подход - создать поток, который является фактическим таймером, вы запускаете поток с аргументом, на этот раз поток спит (хорошо, я знаю, что вы не хотите использовать это, но вы можете использовать другую функцию MsgWaitForMultipleObjects внутри потока чтобы отреагировать, если вы хотите преждевременно прервать таймер) и выполните WaitForSingleObject на дескрипторе потока, когда он сигнализирует, что время истекло (или тайм-аут).
Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)
Другой подход, который требует немного больше работы, - это создать отдельный поток таймера (снова окна), который периодически отправляет сообщение в ваш цикл сообщений.
Третий подход - создать поток, который является фактическим таймером, вы запускаете поток с аргументом, на этот раз поток спит (хорошо, я знаю, что вы не хотите использовать это, но вы можете использовать другую функцию MsgWaitForMultipleObjects внутри потока чтобы отреагировать, если вы хотите преждевременно прервать таймер) и выполните WaitForSingleObject на дескрипторе потока, когда он сигнализирует, что время истекло (или тайм-аут).
Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)
Другой подход, который требует немного больше работы, - это создать отдельный поток таймера (снова окна), который периодически отправляет сообщение в ваш цикл сообщений.
Третий подход - создать поток, который является фактическим таймером, вы запускаете поток с аргументом, на этот раз поток спит (хорошо, я знаю, что вы не хотите использовать это, но вы можете использовать другую функцию MsgWaitForMultipleObjects внутри потока чтобы отреагировать, если вы хотите преждевременно прервать таймер) и выполните WaitForSingleObject на дескрипторе потока, когда он сигнализирует, что время истекло (или тайм-аут).
Есть другие способы сделать это, но я надеюсь, что дал вам хоть еще несколько идей :)
Вы можете вызывать 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 () состоит в том, что вы все еще можете выполнять код во время ожидания. Например ... запрос внешнего сигнала остановки и т. Д.