2010-05-12 8 views
3

Je suis en train de créer un lecteur de flux en C++, j'ai donc besoin du programme pour vérifier de nouveaux flux par intermittence. Cependant, l'utilisateur doit toujours être en mesure d'interagir avec le programme, donc la suggestion que je semble continuer à trouver, pour faire attendre le système, ne fonctionne pas pour moi. Quelqu'un peut-il suggérer une meilleure solution, disons une minuterie qui fonctionne en arrière-plan ou quelque chose?exécuter une fonction toutes les x secondes en C++

Merci, Charles

+0

Quel compilateur utilisez-vous? – Jacob

+0

J'utilise gcc 4.4.1 – wyatt

+3

Un retardateur de fond seul ne le couperait pas; Il est tout à fait possible qu'en essayant de lire un flux, votre programme expirerait sur un appel réseau pour une raison qui n'est pas en votre pouvoir, et cela signifierait que votre programme se bloquerait également dans ce cas. Pour résoudre correctement les deux problèmes, vous devrez entrer dans le monde magique du multithread ... – Jon

Répondre

2

Vous pouvez créer un fil qui dort pendant la période de temps spécifique. Ceci est indépendant du système d'exploitation. Ou, si vous programmez dans Windows, vous pouvez définir un temporisateur pour envoyer un événement de temporisation périodiquement. L'utilisation des minuteurs dépend de votre plateforme de déploiement.

+0

Merci, je vais y jeter un coup d'oeil. Je sais que c'est assez subjectif, mais cela semble-t-il un peu compliqué d'avoir simplement une pause dans le fil, ou est-ce que c'est juste comme ça? – wyatt

+0

Les pauses de thread sont en fait vraiment bonnes - le système d'exploitation peut se dire "D'accord, il n'utilisera pas cela pendant les prochaines x secondes, je peux programmer d'autres tâches entre-temps". L'alternative serait d'avoir une boucle qui fonctionne constamment et vérifie constamment "le temps est-il encore écoulé?" Dans ce cas, le système d'exploitation continuera à allouer du temps au thread "en pause"; ce qui est donc plus inefficace. – Smashery

+2

Sachez que si vous avez juste des pauses fixes de 1 seconde, et que le travail prend une demi-seconde, vous finissez par courir toutes les 1,5 secondes. Vous pourriez vouloir prendre en compte le temps que le travail a pris pour faire. – AshleysBrain

2

Vous aurez besoin de threads. Avoir un thread en arrière-plan faisant la minuterie, et un en premier plan interagir avec l'utilisateur. Ayez ensuite une zone de mémoire partagée entre les threads que le thread d'arrière-plan peut modifier en appelant votre fonction particulière; et que l'on peut voir au premier plan. Peut-être regarder dans la bibliothèque de thread boost: http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html

1

Rendre l'UI et le lecteur d'alimentation séparés threads. Si l'utilisateur fait quelque chose qui nécessite une mise à jour immédiate du flux, interrompez le fil d'alimentation.

0

Pour moi qui sonne comme un candidat pour le Design Pattern Observer:

http://en.wikipedia.org/wiki/Observer_pattern#C.2B.2B

Spawn un fil qui intermittantly vérifier les flux et puis appelez la méthode handleEvent dans votre classe principale aux observateurs qui classe/béton. De cette façon, votre classe principale ne sera pas en attente.

1

Vous pouvez utiliser SIGALRM pour être interrompu toutes les n secondes. Cela n'a pas besoin d'un fil séparé. Votre thread principal entrera dans un gestionnaire de signal.

void sigtime(int signo) 
{ 
    signal(SIGALRM, sigtime); 
} 
.... 
signal(SIGALRM, sigtime); 
itimerval itm; 
itm.it_interval.tv_sec=0; 
itm.it_value.tv_sec = 0; 
itm.it_interval.tv_usec = 200000; 
itm.it_value.tv_usec = 200000; 
setitimer(ITIMER_REAL,&itm,0); 

Bien sûr, cela suppose que vous êtes sur quelque chose unix

+0

+1 et http://www.opengroup.org/onlinepubs/009695399/functions/getitimer.html voir aussi alarm http://www.opengroup.org/onlinepubs/009695399/functions/alarm.html qui renonce à la structure pour secondes intégrales simples – Potatoswatter

0

Je voulais aussi faire un programme qui exécute une fonction toutes les x minutes ou heures et je l'ai trouvé de nombreux exemples, mais pour le faire, il était nécessaire d'inclure et de télécharger une bibliothèque, et pour moi il était mal à l'aise et j'ai fait moi-même, pas logique même)) mais cela fonctionne, vous pouvez le voir ci-dessous

#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
using namespace std; 

struct tm *addtime(struct tm *tm2) 
{ 
     time_t t = time(0); // get time now 
    struct tm * tm1 = localtime(& t); 
    cout << " Time begin : " << tm1->tm_hour << " : " << tm1->tm_min <<endl; 
    struct tm * aux = (struct tm*)malloc(sizeof (struct tm)); 

    aux->tm_sec = tm1->tm_sec + tm2->tm_sec; 
    aux->tm_min = tm1->tm_min + tm2->tm_min + (aux->tm_sec/60) ; 
    aux->tm_hour = tm1->tm_hour + tm2->tm_hour + (aux->tm_min/60); 
    aux->tm_min %= 60; 
    aux->tm_sec %= 60; 
    return (aux); 

} 
bool verif_time(struct tm *tm1) 
{ 

    time_t t = time(0); // get time now 
    struct tm * now = localtime(& t); 
    if (tm1->tm_hour == now->tm_hour && tm1->tm_min == now->tm_min) 
     return true; 
    else 
     return false; 

} 

    int main() 
    { 
    struct tm * after = (struct tm*)malloc(sizeof (struct tm)); 

    after->tm_sec = 0; // here you can modify difference between now time and time when you want to execute function 
    after->tm_min = 1; 
    after->tm_hour = 0; 

    after = addtime(after); 
    cout << " After time" << after->tm_hour << ':' << after->tm_min<<endl; 
    while (true) 
    { 
     if (verif_time(after)) 
     { 
      cout << "Hello " << after->tm_hour << " : " << after->tm_min<<endl; //here you can include your function 

      after->tm_sec = 0; 
      after->tm_min = 1; 
      after->tm_hour = 0; // here also 

      after = addtime(after); 
      cout << " After time" << after->tm_hour << ':' << after->tm_min<<endl; 


     } 
    } 

    } 
Questions connexes