locked
Timer sur thread RRS feed

  • Question

  • Bonjour, comment faire pour declencher une tache tous les 10 ms sans qu'elle soit en boucle infinie forcement , j'ai utilise des sleep(10) mais cela est pas precis. Je suis sur une camera MATROX sous windows CE.net 4.3. Merci
    lundi 9 mars 2009 16:55

Toutes les réponses

  • Bonjour,

    Il vous faut passer par un timer.
    Avec quel langage de programmation développez-vous ?


    Jean-Michel Guemguem Tekigo
    mardi 10 mars 2009 12:24
  • On developpe en C , sous visual studio embedded 4.0. L'application tourne sur une camera intelligente Matrox qui tourne sous Windows CE.net 4.3. La fonction premiere de la camera est de faire du traitement d'image pour recherche de defaut sur des pieces , fonction effectué sans soucis mais on voudrait ajouter l'activation d'une sortie de cette camera pour ejecter les pieces non conformes. le probleme c'est que la piece doit etre ejecte 1 seconde apres le traitement d'image et que d'autre pieces sont a detecter entre-temps. Donc mon ejection doit s'executer sur une 2eme tache en temps réel. Sachant que l'on traite environ 10 pieces a la secondes, que l'arrivé des pieces n'est pas régulieres et que l'ejection dure 50ms. Je voulais faire la 2eme tache qui s'active toutes les 10 ms précisément ce qui me permet de pouvoir faire les actions en conséquence.

    mardi 10 mars 2009 12:54
  • Je propose alors d’utiliser un event pour signaler une pièce défectueuse.

    Lorsque le thread en charge de la détection des pièces en repère une défectueuse, il monte l'event (via setevent).
    Un autre thread en charge de l'éjection se réveille sur l'event (via WaitForSingleObject), attend 1s (via sleep) , fait l'éjection, puis se rendort en attendant le prochain event.

    Ce qui me gène un peu dans votre besoin c'est le temps d'attente de 1s. Pourquoi cette attente de 1s, il serait probablement plus sûre d'avoir un capteur de passage sur le bras d'éjection associés à une mémorisation de l'ordre d'éjection.


    Jean-Michel Guemguem Tekigo
    mardi 10 mars 2009 15:06
  • on a deja essayé,  la fonction sleep n'est pas assez precise, vous pouvez avoir des variations de 50 ms dans le reveil de la tache !!
    votre solution de mettre un detecteur de passage est impossible , defilement tres rapide ( 1 piece tous les 100 ms !!!) et il n'y a que 20 ms entre la fin d'une piece et le debut d'une  autre voir moins d'ou aussi l'utilité de la camera pour voir egalement la position de la piece, en fait la camera effectue la recherche de defaut sur plusieurs pieces en meme temps a chaque prise d'image!
    mardi 10 mars 2009 16:20
  • Cela ressemble à un problème de priorité. Si l'ordonnanceur ne donne pas la main au bout du sleep au thread, c'est qu'il y a un ou des threads plus prioritaires. Pour les identifier (et connaitre leurs niveaux de priorité), le plus simple est d'utiliser le kernel tracker. A partir de ces éléments, il reste à déterminer s'il est possible (et raisonnable) d'augmenter le niveau du thread en charge de l'éjection.
    Pouvez-vous publier la trace du kernel tracer lors du sleep (avec quelques infos sur les processus, et leurs threads) ?


    Jean-Michel Guemguem Tekigo
    mercredi 11 mars 2009 00:19
  •   je n'ai pas l'outil kernel tracker sur ma camera. Votre solution d'augmenter le thread est une chose mais le probleme c'est que la tache doit memoriser plusieur reveil d'evenements ! je peus avoir plusieurs produits a ejecter entre le traitement d'image et l'ejecteur avec votre solution je ne peus ejecter qu'un seul produit a la fois. De plus la tache s'execute pendant un temps delta que je ne maitrise pas et si j'effectue un sleep(100) a la fin de celle-ci alors ma tache s'execute ts les 100+delta et non pas tous les 100 ms exactement. Il faudrait que je puisse executer une tache sur une horloge de la camera. La camera est sur base PC celeron M 400Mhz. Je trouve tres peu d'information sur internet et dans les livres pour pouvoir executer une tache périodique precise qui me permettrait de faire une base de temps et alors mon probleme serait résolu!
    jeudi 12 mars 2009 08:08
  • Bonjour,

    Depuis WinCE 4.2, l'API des timers multimedia est disponible, elle évite de passer par le Sleep, les fonctions sont:
    timeGetDevCaps
    timeBeginPeriod
    timeSetEvent

    Thierry JOUBERT - THEORIS
    jeudi 12 mars 2009 15:07
  • Merci, on essaye et on vous tiens au courant!
    jeudi 12 mars 2009 16:15
  • cela marche nettement mieux avec ces fonctions. J'ai bien un declenchement tous les 100 ms. Il me reste maintenant a regler un probleme de priorite de tache dans la camera. J'ai beau mettre ma tache qui s'execute périodiquement en priorite 0 , j'ai quand meme une autre tache, la prise  d'image,  qui s'execute certainement en priorite 0 avec un quantum a 0 et qui me bloque ma tache périodique de temps en temps a chaque prise d'image. Le probleme c'est que je n'ai pas de controle sur cette tache ! On voit avec le fabricant de camera!
    lundi 16 mars 2009 10:54
  • Vous pouvez obtenir les priorités de Threads en train de tourner avec le CESHELL ou les Remote Tools.

    Il est peut-être possible de retrouver par programme le HANDLE du thread Camera avec CreateToolhelp32Snapshot, puis Process32First - Process32Next et enfin Tread32First - Thread32Next. A partir de là la priorité de ce thread peut être changée avec CeSetThreadPriority.

    Thierry Joubert - THEORIS
    mercredi 18 mars 2009 06:13
  • Avez-vous résolu le problème de priorité de thread?
    Jean-Michel Guemguem
    Tekigo
    http://blog.tekigo.com
    vendredi 10 avril 2009 20:22