OVH Cloud OVH Cloud

Timer qui ne fonctionne plus ?

7 réponses
Avatar
Blasty
Bonjour,

J'ai des timers windows dans mon application (SetTimer(...)) qui fonctionne
correctement. Parfois, un de mes timers semble ne plus fonctionner; j'ai
l'impression de ne plus passer dans le case de mon timer:
OnTimer(UNIT id)
{
case MON_TIMER_ID:
}

La fonction est bien appelee car d'autres timers continuent de fonctionner.
J'aimerais savoir s'il est possible que le timer s'arrete a cause de
ressources system basse par exemple. Le probleme n'etant pas facilement
reproductible, vos reponses sont les bienvenus.

7 réponses

Avatar
Ambassadeur Kosh
s'assurer que MON_TIMER_ID ne subit pas "d'effet de modification"
(side-effect)
s'assurer qu'il n'y a pas de KillTimer qui soit passé par on ne sait quel
miracle.
vérifier que la procedure passée en parametre du SetTimer est bien celle
dont on controle l'execution.
si on traite le message, vérifier que la proc passée est NULL et que
MON_TIMER_ID est comparé à WM_PARAM.
et enfin, vérifier que le SetTimer n'est pas appellé plus d'une fois avec
MON_TIMER_ID avec des parametres comprometants.

c'est un peu du genre "vérifier que l'imprimante est bien allumée", mais
bon...
Avatar
Blasty
Merci pour ta reponse, mais je voulais savoir si il etait possible que le
timer ne soit plus actif a cause de windows ou si ce cas etait tres tres
improbable. Bien entendu c'est tres probablement a cause du programme en lui
meme mais comme la doc dis que les timer sont des ressources limites et que
j'en utilise 7 et sachant que le probleme n'arrive pas sur les machines
puissantes...



s'assurer que MON_TIMER_ID ne subit pas "d'effet de modification"
(side-effect)


c'est un #define

s'assurer qu'il n'y a pas de KillTimer qui soit passé par on ne sait quel
miracle.


non, les rares fois ou KillTimer est appele, c'est logge et le log n'est pas
apparu.

vérifier que la procedure passée en parametre du SetTimer est bien celle
dont on controle l'execution.


Je ne suis pas sur de comprendre mais le SetTimer est fait dans le
constructeur du 'MainFrame.cpp' (si je puis dire)

si on traite le message, vérifier que la proc passée est NULL et que
MON_TIMER_ID est comparé à WM_PARAM.


Oui la proc passee est NULL,et MON_TIMER_ID est compare a l'argument de
OnTimer(UINT nIDEvent)

et enfin, vérifier que le SetTimer n'est pas appellé plus d'une fois avec
MON_TIMER_ID avec des parametres comprometants.


SetTimer peut etre appele plusieurs fois mais avec toujours les memes
arguments

c'est un peu du genre "vérifier que l'imprimante est bien allumée", mais
bon...


merci quand meme. Pour l'instant je pense que la cause relle est un probleme
de donnees partagees entre plusieurs threads. (et bien sur sans section
critiques...)
Avatar
Vincent Burel
"Blasty" wrote in message
news:3fa67b9c$0$251$
Merci pour ta reponse, mais je voulais savoir si il etait possible que le
timer ne soit plus actif a cause de windows ou si ce cas etait tres tres
improbable. Bien entendu c'est tres probablement a cause du programme en


lui
meme mais comme la doc dis que les timer sont des ressources limites et


que
j'en utilise 7 et sachant que le probleme n'arrive pas sur les machines
puissantes...



WM_TIMER est un message comme un autre, votre callback sera appelé avec ce
message quand celle-ci sera libre. Donc le temps entre deux appels WM_TIMER
est variable.

VB
Avatar
Ambassadeur Kosh
> > s'assurer que MON_TIMER_ID ne subit pas "d'effet de modification"
> (side-effect)
c'est un #define



j'ai relu la doc : UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse, void
(CALLBACK*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD) );

et l'exemple deux lignes plus loin dit ça :
m_nTimer = SetTimer(1, 2000, 0);
KillTimer(m_nTimer);

pourquoi un PTR et pas un UINT.
qui a bon ? l'exemple ou l'interpretation du prototype ?

non, les rares fois ou KillTimer est appele, c'est logge et le log n'est


pas apparu.
[...]
de donnees partagees entre plusieurs threads. (et bien sur sans section
critiques...)



7 timer, ça fait un peu beaucoup quand même.
y'a une vraie raison d'en avoir autant ou c'est une forme d'attente active ?
Avatar
Dominique Vaufreydaz
Bonjour,

j'ai relu la doc : UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse, void
(CALLBACK*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD) );
et l'exemple deux lignes plus loin dit ça :
m_nTimer = SetTimer(1, 2000, 0);
KillTimer(m_nTimer);



OUiai, deja vu ca... Reste que si tu utilise MFC le OnTimer te file
un int...

pourquoi un PTR et pas un UINT.
qui a bon ? l'exemple ou l'interpretation du prototype ?



L'exemple je pense...

non, les rares fois ou KillTimer est appele, c'est logge et le log n'est


pas apparu.
[...]
de donnees partagees entre plusieurs threads. (et bien sur sans section
critiques...)


7 timer, ça fait un peu beaucoup quand même.



5 ca tourne sans probleme.

Sinon notez aussi que la queue des messages est limitee en taille
depuis Windows 2000 (voir mon pipo la dessus sur www.lafaqmfc.com)
et que cela peut entrainer des pertes de messages (ce qui n'etait pas
le cas de NT4, ca peut venir de la. Sachant que perso, je perdait des messages
car j'avais pleins de threads qui discutaient entres eux !

Doms.
--
Impose ta chance, serre ton bonheur et va vers ton risque.
A te regarder, ils s'habitueront.
René Char, Les Matinaux.
----
http://www-prima.inrialpes.fr/Vaufreydaz/
http://slmg.imag.fr/
http://slmg-index.imag.fr/
http://TitchKaRa.free.fr/
http://logiciels.ntfaqfr.com/
Avatar
Vincent Burel
"Ambassadeur Kosh" wrote in message
news:bo7lce$jnr$
j'ai relu la doc : UINT_PTR SetTimer(UINT_PTR nIDEvent, UINT nElapse, void
(CALLBACK*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD) );

et l'exemple deux lignes plus loin dit ça :
m_nTimer = SetTimer(1, 2000, 0);
KillTimer(m_nTimer);

pourquoi un PTR et pas un UINT.
qui a bon ? l'exemple ou l'interpretation du prototype ?



l'exemple est bon.

Ne pas faire un KillTimer avec le nIDEvent donnée au SetTimer comme il est
dit et montré dans la doc MSDN.

Vincent Burel
Avatar
Ambassadeur Kosh
> > 7 timer, ça fait un peu beaucoup quand même.
5 ca tourne sans probleme.



oui.

mais je me demande si en fait, la véritable solution à son probleme ne
serait pas de remplacer les timers par quelque chose de plus adapté. encore
faut il savoir à quoi servent les timers. c'était juste une intuition...