[C++] Utilisation de timer sous Visual C++ avec API Win32

Utilisation de timer sous Visual C++ avec API Win32 [C++] - C++ - Programmation

Marsh Posté le 08-05-2003 à 16:45:02    

Bonjour,
 
J'ai besoin d'utiliser un timer dans une application Win32. J'ai ecris le code suivant pour l'activer :
 

Code :
  1. SetTimer(NULL, IDT_TIMER, 500, (TIMERPROC) NULL);


 
et ca dans ma fonction callback :
 

Code :
  1. case WM_TIMER:
  2.     switch (wParam)
  3.     {
  4.         case IDT_TIMER:
  5.             ...
  6.             break;
  7.     }
  8. break;


 
Mais aucun message WM_TIMER n'est créé donc ca fait rien. Est ce que je me suis trompé quelque part???
 
Une autre petite question, y a t'il une periode à partir de laquelle ca ne sert à rien de decendre ou est ce que le timer fonctionne tres bien jusqu'a 1ms?
 
Merci

Reply

Marsh Posté le 08-05-2003 à 16:45:02   

Reply

Marsh Posté le 08-05-2003 à 17:02:47    

ptet le 1er parametre de SetTimer(), faudrait ke ca soit le handle de la fenetre ki prend en compte le timer.

Reply

Marsh Posté le 08-05-2003 à 17:06:56    

Je pense pas qu'on puisse descendre jusqu'à 1 ms avec les timers.
Je crois que la précision ne descend pas sous les 50-60 ms.

Reply

Marsh Posté le 08-05-2003 à 17:07:40    

J'avais essayé aussi avec le handle de la fenetre mais ca marche pas non plus.
 
Sinon y'a pas un autre moyen de faire un timer en C++, il me faudrais un truc assez rapide quand meme.

Reply

Marsh Posté le 08-05-2003 à 19:22:28    

ben deja ton ::SetTimer(hwnd, IDDETONTIMER, iTempsMilisecond, NULL) il retourne normalement IDDETONTIMER si c ok, tu le test ?
 
Sinon tu le Set a partir de koi ? (enfin ds une classe si c derive de CWnd tu peu utilsier SetTimer(IDDETONTIMER, iTempsMillisecond, NULL) aussi).

Reply

Marsh Posté le 08-05-2003 à 20:59:51    

VisualC++ a écrit :

ben deja ton ::SetTimer(hwnd, IDDETONTIMER, iTempsMilisecond, NULL) il retourne normalement IDDETONTIMER si c ok, tu le test ?
 
Sinon tu le Set a partir de koi ? (enfin ds une classe si c derive de CWnd tu peu utilsier SetTimer(IDDETONTIMER, iTempsMillisecond, NULL) aussi).


 
tu t'emballes, regarde le titre, c de l'api win32 :D
 
(bon ca change rien a la validité de ta remarque sur le test du code de retour)

Reply

Marsh Posté le 08-05-2003 à 21:18:28    

D'ou l evocation des 2 fonctions :whistle:

Reply

Marsh Posté le 08-05-2003 à 21:56:29    

Bah c ca que je ne comprend pas, dans MSDN y'a marké que si ca marche ca retourne un nombre different de 0. G verifié et ca retourne bien une valeur ... mais ca marche pas :??: . Je comprend pas... :(

Reply

Marsh Posté le 08-05-2003 à 22:00:32    

Ben si la valeur de retour = IDDETONTIMER c bon.
 
Maintenant tu parles de ta fonction callback mais c laquelle ?
Car soit c une vrai callback et c'est pas NULL que tu dois passer au SetTimer, sinon c ds la message queue que tu recup.
 
MAis ton code un poil lege la pour voir.

Reply

Marsh Posté le 08-05-2003 à 22:12:47    

C dans la fonction callback principale. Mais comme g dit plus tot g essayé avec le handle de la fenetre et ca marche pas non plus...
 
Voila ma fonction callback :

Code :
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. int wmId, wmEvent, error, i, nbpt;
  4. PAINTSTRUCT ps;
  5. HDC hdc;
  6. static TripodeData Data;
  7. char g_FileName[100]="";
  8. static int etape=0;
  9. UINT retour=-1;
  10. switch (message)
  11. {
  12. case WM_CREATE:
  13. retour = SetTimer(hWnd, IDT_TIMER, 50, 0);
  14. break;
  15. case WM_COMMAND:
  16. wmId    = LOWORD(wParam);
  17. wmEvent = HIWORD(wParam);
  18. switch (wmId)
  19. {
  20. case IDM_EXIT:
  21.   DestroyWindow(hWnd);
  22.   break;
  23. case IDM_OPEN:
  24. //Ouverture du fichier
  25. error = GetFileName(hWnd, g_FileName);
  26. LectureDonnees(g_FileName, Data);
  27. if(error!=1)
  28. MessageBox(hWnd,"Probleme de lecture des données","Erreur",MB_ICONEXCLAMATION);
  29. else
  30. MessageBox(hWnd,"Fichier ouvert","OK",MB_ICONEXCLAMATION);
  31. //Affichage des données chargées
  32. InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd);
  33. retour = SetTimer(hWnd, IDT_TIMER, 50, 0);
  34. break;
  35. case WM_TIMER:
  36. /*switch (wParam)  
  37. {  
  38. case IDT_TIMER:*/
  39. if(etape<Data.nbptPoints)
  40. etape++;
  41. else
  42. KillTimer(hWnd, IDT_TIMER);
  43. InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd);
  44. /*break;   
  45. }*/
  46. break;
  47. default:
  48. return (DefWindowProc(hWnd, message, wParam, lParam));
  49. }
  50. break;
  51. case WM_PAINT:
  52. hdc = BeginPaint (hWnd, &ps);
  53. nbpt=Data.nbptPoints;
  54. if(nbpt!=0)
  55. {
  56. Ellipse(hdc,(int)(20*Data.points[etape].x + 249),(int)(20*Data.points[etape].y + 249),
  57. (int)(20*Data.points[etape].x + 251),(int)(20*Data.points[etape].y + 251));
  58.    }
  59.    EndPaint (hWnd, &ps);
  60.    break;
  61. default:
  62.   return (DefWindowProc(hWnd, message, wParam, lParam));
  63. }
  64. return (0);
  65. }

Reply

Marsh Posté le 08-05-2003 à 22:12:47   

Reply

Marsh Posté le 08-05-2003 à 22:26:39    

c détail, mais t'as pas le droit de faire :
char g_FileName[100]="";
 
sinon pour ton pb de timer, t'es sur que t'y entres meme pas une seule fois ? met genre une msgbox ou autre pour voir.

Reply

Marsh Posté le 08-05-2003 à 22:30:49    

Je vien d'essayer avec une message box et elle ne s'affiche pas donc ca ne rentre meme pas dans le WM_TIMER (j'avais regardé o debugger..).
 
Pkoi on a pas le droit de faire : char g_FileName[100]="";???

Reply

Marsh Posté le 08-05-2003 à 22:44:31    

Euh je suis pas sur que WM_TIMER fasse partit de WM_COMMAND  :??: Faudrait verifier

Reply

Marsh Posté le 08-05-2003 à 22:45:33    

Pas con ca je v essayer et je vous di

Reply

Marsh Posté le 08-05-2003 à 22:48:52    

C t ca merci beaucoup. C toujours les trucs les plus bete au quel on ne pense pas. :p  
 
Encore merci, A+  :jap:

Reply

Marsh Posté le 08-05-2003 à 22:49:55    

Dr (tj poster un peu plus de code ;))
 
:jap:

Reply

Marsh Posté le 08-05-2003 à 22:52:45    

C clair la prochaine fois je mettrais tout mon projet  :D. G passer tout l'aprem à bloquer et en 2s tout fonctionne parfaitement c genial...  :bounce:

Reply

Marsh Posté le 09-05-2003 à 18:59:05    

Au fait :  
sous windows fo pas esperer descendre ne dessous de ~30ms... sinon fo prendre RT Windows ou un truc dans le genre (un pack specialement develepper pour le temps réel(cad + deterministe) sous Windows....

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed