begin process at 2012 05 29 22:36:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Probleme de timer avec fonction de callback


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de timer avec fonction de callback

mercredi 2 août 2006 à 11:28:58 | Probleme de timer avec fonction de callback

julienbj

Bonjour,
j'ai un petit souci lors de la création d'un timer avec une fonction de callback.

Voici un bout de code qui ne fonctionne pas, mais je ne vois pas pourquoi. Au debuggeur, j'ai testé les valeurs de retour de SetTimer et KillTimer, aucun souci, pourtant je ne rentre jamais dans la fonction de callback (point d'arret).

VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
 printf(".\n");
}

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
 unsigned int id;
 MSG msg;

 printf("Création du thread\n");
 id = SetTimer(NULL, 0, 100, Timer);
 while (GetMessage(&msg, NULL, 0, 0));
 KillTimer(NULL, id);
 printf("Fin du thread\n");
 return 0;
}

int main(void)
{
 DWORD ThID;
 HANDLE hTd;

 hTd = CreateThread(NULL, 256, ThreadProc, NULL, 0, &ThID);
 while (!_kbhit());
 TerminateThread(hTd, 0);
 return 0;
}

Cependant, si je ne mets pas de fonction de callback et que j'intercepte le message WM_TIMER dans la boucle while avec le GetMessage, je n'ai pas de problèmes.

Si vous pouviez m'indiquer pourquoi ma fonction de callback n'est pas appelé, ce que j'ai mal fait...
Merci d'avance

Vive le C
Savon

mercredi 2 août 2006 à 11:45:30 | Re : Probleme de timer avec fonction de callback

julienbj

Réponse acceptée !

Ok, c'est bon, j'ai trouvé.

Comme quoi, il faut demander de l'aide pour avoir une idée ;)

Bref, il y avait 2 problemes. Dans le SetTimer, il manquait un & devant la fonction de callback, et dans la boucle while(GetMessage...), il falait rajouter bien évidemment de quoi transmettre les messages:

TranslateMessage(&msg);DispatchMessage(&msg);

Vive le C
Savon

mercredi 2 août 2006 à 16:44:23 | Re : Probleme de timer avec fonction de callback

aardman

Membre Club
Salut,
Je vois pas vraiment l'utilité du timer ici, tu aurais aussi pu faire une boucle infinie avec un Sleep(100) et un printf(), non?

jeudi 3 août 2006 à 17:57:10 | Re : Probleme de timer avec fonction de callback

julienbj

Oui, evidemment, ce bout de code ne servait d'exemple que pour expliquer mon problème.

Vive le C, Savon

mercredi 9 août 2006 à 15:12:58 | Re : Probleme de timer avec fonction de callback

Oliv_Nav

bonjour !

ca m'intéresse, votre histoire. Y'a quelquechose qui m'échappe : quelle est l'utilité de Settimer ?

Pour moi, ca lancait comme un mini thread caché, qui émettait des evenements périodiquement. Ces evenements allaient réveiller la fonction en call back.

Mais à partir du moment ou on met ca derriere : 

 while (GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

on reste bloqué sur le while. Du coup, le déroulement dans le thread en cours est interrompu.

Bref, pour poser une question, est-il possible d'obtenir le fonctionnement que je decris plus haut (mon mini thread caché), ou dois-je créer carrément un thread (dans ce cas, j'ai vraiment du mal à saisir l'intéret de Settimer, vis à vis d'un Sleep) ?

Merci et bonne journée

Olivier

mercredi 9 août 2006 à 17:00:22 | Re : Probleme de timer avec fonction de callback

Oliv_Nav

je reviens juste sur ce que j'ai écrit : j'ai l'air de faire la meme remarque que aardman ; sauf que lui, il a compris l'intéret des settimer dans le cas général. Pas moi. 
Je viens donc chercher des infos plus général, pour comprendre comment on est censé se servir de cette fonction

Merci

Olivier 

mercredi 9 août 2006 à 17:25:33 | Re : Probleme de timer avec fonction de callback

aardman

Membre Club
Salut,
L'intéret de ce type de timer, c'est qu'il est très facile à utiliser, mais par contre on est obligé de l'utiliser dans un thread qui possede une boucle de message (comme celle de ton post), car les evenements du timer sont recus et traités sous forme de messages windows.
jeudi 10 août 2006 à 11:35:28 | Re : Probleme de timer avec fonction de callback

Oliv_Nav

merci pour ta réponse, mais je vois pas encore bien.

Pourrais-tu me donner un exemple dans lequel il est plus malin d'utiliser "setTimer" plutot que "while() Sleep(xxx) SetEvent(xxx)" ?

merci !

jeudi 10 août 2006 à 15:19:05 | Re : Probleme de timer avec fonction de callback

Oliv_Nav

il me vient une autre remarque / question : quand je fais un thread, j'aime bien ne pas rester bloqué à l'intérieur (que ce soit dans un Sleep ou un getMessage) :
 
je me met en attente d'evenement.
quand j'en recois un, je fais vite mon traitement, et me remet en attente.

Ca permet d'etre presque toujours dispo aux evenement.

La, tout le temps ou je suis dans le Sleep, ou le while GetMessage), je n'ecoute rien d'autre. Ca me chiffonne, parce que j'aimerais bien recevoir un message qui me permette d'arreter le thread proprement et rapidement.

Comment gérer cet arret de thread au moment ou le message d'arret arrive ?

jeudi 10 août 2006 à 18:41:58 | Re : Probleme de timer avec fonction de callback

aardman

Membre Club
Salut,
Tu sembles parler de Sleep() et de GetMessage() comme qu'ils avaient la même fonction et qu'ils bloquaient le thread de la même facon.
Sleep() est une fonction qui bloque completement le thread, pendant un temp bien determiné. GetMessage(), par contre, bloque le thread jusqu'a ce qu'un message soit posté dans la pile de message du thread. Si ce message est WM_QUIT, GetMessage() retourne FALSE (ce qui a pour effet de sortir de la boucle de message). Sinon, GetMessage retourne TRUE, et le message est traité (généralement, par TranslateMessage() et DispatchMessage()).

Pour en revenir aux timers, SetTimer() génere ses evenements sous forme de message windows, et donc il est parfait pour s'integrer dans un thread qui a une boucle de message.

Pour ta question sur le thread, tu peux le faire avec une boucle de message.
Pour terminer ton thread, it te suffit d'envoyer un WM_QUIT a ton thread.

Un dernier truc: il existe d'autres types de timers sous windows: SetWaitableTimer(), CreateTimerQueueTimer(), ...


1 2

Cette discussion est classée dans : fonction, timer, printf, callback, dword


Répondre à ce message

Sujets en rapport avec ce message

Passer un pointeur sur une instance à une fonction membre static ? [ par tintin72 ] Bonjour, j'ai un problème pour passer un pointeur sur une instance ou l'adresse de l'instance à une fonction callback Windows. Je m'explique J'ai créé Utilisation de fonctions Callback [ par N0euX ] Bonjour a tous,</o: Problème avec la fonction callback du timer [ par Arkadias ] Bonjour tout le monde, je suis confronté à un problème de timer.Voila la situation :Dans le cadre d'un projet de conversion de protocole, je récupère gluttimerfunc et sections critiques... [ par thespartan ] Bonjour. Je veux faire des animations en fonction du temps écoulé... D'une part j'ai ma fonction principale d'affichage : affichage ( ){ dessineBoule( Appel fonction avec GTK+ [ par ptityo31 ] Bonjour,je débute sur GTK+, et j'aimerai avoir des précisions sur le lancement d'une application à partir d'un clic.En effet je dois envoyer des trame Printf & Puts [ par dayvid75014 ] Bonjour à tous,Quelqu'un connait-il la difference entre la fonction printf et la fonction puts ?Merci. PROBLEME GESTION DE FILE !!!!!!!!! [ par POWERC85 ] Bonjour à tous, Voilà je suis débutant en langage C et j'ai un travail à faire sur les Files... On me demande de faire : 1 fonction qui permet d'ajout besoin d'aide Timer [ par wadwin ] Salut a tous j'ai un souci avec les <span class="spellmod" title="Faute d'orthographe - suggestions : dîners, tiers, rimeurs, tumeurs, tuners, dîne Timer & service [ par deck_bsd ] Bonjour à tous.Voici mon problème,J'ai crée un timer dans mon service, mais celui-ci ne fonctionne pas (je suis certain que c'est le timer car j'ai te Timer sous visual c++4.0 [ par leuk ] Bonjour à tous,Je développe sur un microprocesseur équipé d'un OS windows CE. Cependant je voudrai utiliser son timer pour caluculer un débit toutes l


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,388 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales