Appeler périodiquement une procédure

cs_elbok Messages postés 12 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 28 avril 2008 - 4 mars 2008 à 00:58
cs_elbok Messages postés 12 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 28 avril 2008 - 4 mars 2008 à 22:44
bon soir
j'ai besoin de répéter périodiquement (tte les secondes) le traiement d'une procédure.
je travail avec visuel C++ et je développe en C une aplliction sous dos.
aider moi S.V.P et merci d'avance

6 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
4 mars 2008 à 01:49
Salut,
Tu peux utiliser les timers:
SetTimer: http://msdn2.microsoft.com/en-us/library/ms644906(VS.85).aspx

Et executer ta fonction a chaque fois que tu recoit un WM_TIMER

Neo_Fr
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 mars 2008 à 02:06
Sûrement pas avec une console. Faudrait une pompe à messages. Cependant, elle bloquera le thread.
La solution est d'utiliser plusieurs threads. Ceci par exemple:

#include <windows.h>
#include <stdio.h>

BOOL bEnd = FALSE;

DWORD __stdcall threadroutine (void *param)
{
    // Tant que bEnd est à FALSE, on continue
    while(!bEnd) {
        printf("100\n"); // On affiche "100" à toute les 100 milisecondes
        Sleep(100);
    }

    return 0;
}

int main ()
{
    // On créer et démarre le nouveau thread
    // Sa routine est threadroutine
    HANDLE hThread = CreateThread(0, 0, threadroutine, 0, 0, 0);
    int i;

    // Pendant que le second thread roule, on fait nos petite affaires dans ce thread
    for(i = 0; i < 10; i++) {
        Sleep(1000);
        printf("Bonjour\n");
    }

    // Une fois terminé, on met bEnd à TRUE pour indiquer que l'on veut terminer le second thread
    bEnd = TRUE;

    // On attend que la routine quitte
    WaitForSingleObject(hThread, INFINITE);
    // Puis on ferme le thread
    CloseHandle(hThread);

    return 0;
}

C++ (@++)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 mars 2008 à 02:20
Si tu veux avoir plus d'info, fais une recherche avec le nom des fonctions dans le MSDN.
http://msdn.microsoft.com/library/

C++ (@++)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
4 mars 2008 à 21:05
Salut,
Même avec une console on peut utiliser le timer en ajoutant une boucle des messages.
On utilisera donc normalement SetTimer() et KillTimer(). Le message WM_TIMER sera intercepté au sein de la boucle des messages. J'ai utilisé cette technique dans mes deux derniers codes sources:
DÉTOURNER LA FRAPPE CLAVIER
APPLICATION WIN32 SANS FENÊTRE ET AVEC BOUCLE DES MESSAGES
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 mars 2008 à 21:59
Tu n'as pas lu mon message complètement:
"

Sûrement pas avec une console. Faudrait une pompe à messages. Cependant, elle bloquera le thread."
La seule solution pour ne pas bloquer le thread principal est de faire plusieurs threads. Dans ce cas, aucun besoin de timer puisqu'une boucle + Sleep fera le travail (pour ce qu'il demande en tout cas).

C++ (@++)
0
cs_elbok Messages postés 12 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 28 avril 2008
4 mars 2008 à 22:44
j'ai essayé d'utiliser votre code parce que c'est ce que je cherche vraiment et je l'ai modifié comme suis:




DWORD __stdcall threadroutine (AP *v,cl *cli)

    //BOOL bEnd = FALSE;
    // Tant que bEnd est à FALSE, on continue
    while(!bEnd) {
        //printf("************ 100 ms passees ************\n"); // On affiche "100" à toute les 100 milisecondes
        verifier_connexion(cli,&v);
  printf("\n");
  Sleep(100);
    }


    return 0;
}

mais il me génère tjr l'erreur suivante;
warning C4047: 'function' : 'unsigned long (__stdcall *)(void *)' differs in levels of indirection from 'unsigned long '
0
Rejoignez-nous