2010-06-21 4 views
1

gcc 4.4.3 ++ 2008 vcCréation d'une simple application de la minuterie

Je voudrais faire une demande de minuterie serait portable sur Windows et Linux. Cependant, serait suffisant pour commencer.

Mon idée est de démarrer une minuterie et de la régler pour un nombre de secondes spécifié. Lorsque le temps expire, appelez une fonction de rappel.

Est-ce la meilleure façon de procéder?

Un grand merci,

+0

Ce que vous décrivez ne ressemble pas à une « application »; cela ressemble à une infime partie d'une interface de programmation (API). En outre, le texte de votre question est étrangement incomplet, la deuxième phrase s'arrête juste. Je suggère de l'éditer. – unwind

+0

ne pouvez-vous pas utiliser la bibliothèque existante qui fait cela? "boost :: asio :: deadline_timer" est celui que vous cherchez. –

+1

jetez un oeil à cet exemple, http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/example/timers/tick_count_timer.cpp –

Répondre

1

Il existe plusieurs façons de faire une minuterie. Ce n'est pas difficile mais vous devez penser exactement ce que vous voulez. Si vous voulez appeler un rappel, vous utilisez généralement un thread qui dort jusqu'à ce que votre délai soit écoulé, avant d'appeler votre callback. Si vous ne souhaitez pas utiliser un thread, vous pouvez appeler périodiquement une fonction de vérification qui calcule le delta temporel.

Vous api sera une fonction prenant le retard et un pointeur de fonction plus les paramètres de rappel. Il lancera un thread qui dormira pour le délai, puis appellera le callback avec les paramètres donnés.

Vérifiez les bibliothèques à usage général, elles ont généralement des temporisations implémentées (gtk + glib, boost :: timer je pense).

MY2C

Edit:

Pour la partie de la portabilité, vous avez bien sûr d'écrire deux versions de votre fonction de minuterie. Si vous utilisez un thread, cela signifie qu'il vaut mieux utiliser un lib. Comme les libs vous donnent des timers ... Utilisez une lib :)

1

Windows et Linux ne minuteries différemment. Je suggère que vous encapsuliez la fonctionnalité de synchronisation dans une classe. Vous devrez écrire la classe deux fois (une fois pour chaque plate-forme), mais le reste du programme peut être le même. Alternativement, vous pouvez utiliser une boîte à outils où quelqu'un d'autre gaz l'a déjà fait pour vous. par exemple. QT ou Boost.

0

J'ai travaillé avec plusieurs temporisateurs de ce type en C et C++. Pour C GTK exemple sur l'URL suivant peut être utile http://zetcode.com/tutorials/gtktutorial/gtkevents/. En C++ j'ai utilisé la minuterie glib https://developer.gnome.org/glibmm/2.34/classGlib_1_1SignalTimeout.html (bien que ce ne soit pas précis). Je travaille aussi avec libev (qui utilise epoll() sous Linux et select() sous Windows) pour une meilleure précision. C, je vous présente un exemple ci-dessous

//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; 
} 

Pour plus de docs vue sur libev http://doc.dvgu.ru/devel/ev.html

Questions connexes