Создание простого приложения таймера - PullRequest
1 голос
/ 21 июня 2010

gcc 4.4.3 vc ++ 2008

Я бы хотел, чтобы приложение таймера было переносимым на windows и linux.Тем не менее, было бы достаточно для начала.

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

Это лучший способ сделать это?

Большое спасибо,

Ответы [ 3 ]

1 голос
/ 21 июня 2010

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

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

Проверьте библиотеки общего назначения, они обычно имеют встроенные таймеры (gtk + glib, boost :: timer, я думаю).

my2c

Edit:

Что касается переносимости, вам, конечно, нужно написать две версии функции таймера. Если вы используете thread, это означает, что лучше использовать lib. Поскольку библиотеки дают вам таймеры ... Используйте lib:)

1 голос
/ 21 июня 2010

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

В качестве альтернативы вы можете использовать инструментарий, где кто-то другой уже сделал это для вас. например QT или Boost.

0 голосов
/ 05 июня 2013

Я работал с несколькими такими таймерами как на C, так и на C ++. Для примера C GTK следующий URL может быть полезен http://zetcode.com/tutorials/gtktutorial/gtkevents/. В C ++ я использовал glib timer https://developer.gnome.org/glibmm/2.34/classGlib_1_1SignalTimeout.html (хотя это не точно). Я также работаю с libev (который использует epoll () в Linux и select () в Windows) для большей точности таймера. Для C я приведу пример ниже

//This program is demo for using pthreads with libev.
//Try using Timeout values as large as 1.0 and as small as 0.000001
//and notice the difference in the output

//(c) 2013 enthusiasticgeek for stack overflow
//Free to distribute and improve the code. Leave credits intact
//On Ubuntu (assuming libev is installed) compile with the command - gcc -g test.c -o test -lev

#include <ev.h>
#include <stdio.h> // for printf
#include <stdlib.h>

double timeout = 1.0; //seconds
ev_timer timeout_watcher;
int timeout_count = 0;

static void timeout_cb (EV_P_ ev_timer *w, int revents) // Timer callback function
{   
    ++timeout_count;
    printf("%d\n", timeout_count);
    w->repeat = timeout;
    ev_timer_again(loop, &timeout_watcher); //Start the timer again.
}

int main (int argc, char** argv)
{
    struct ev_loop *loop = EV_DEFAULT;  //or ev_default_loop (0);
    ev_timer_init (&timeout_watcher, timeout_cb, timeout, 0.); // Non repeating timer. The timer starts repeating in the timeout callback function
    ev_timer_start (loop, &timeout_watcher);

    // now wait for events to arrive
    ev_loop(loop, 0);

    return 0;
}

Для получения дополнительной информации о свободном виде http://doc.dvgu.ru/devel/ev.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...