IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Timer multimedia avec mmsystem


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut Timer multimedia avec mmsystem
    Bonjour , je suis actuellement en train de tester les timers dits multimedia avec l'unité mmsystem.Pour une raison étrange , le code ci-dessous ne marche que quand un showmessage est appellé , juste avant l'assignation du callback.Je cherche une explication rationelle à celà.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    implementation
    {$R *.dfm}
    procedure FNTimeCallback(uTimerID,uMsg:UINT;dwUser,dw1,dw2:DWORD);stdcall;
    begin
      Form1.OnTimer;
    end;
    function TForm1.InitTimer:UINT;
    begin
     result := timeSetEvent(1000,1,FNTimeCallback,DWORD(self),Time_periodic);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if TimerID<>-1 then
        begin
          timeEndPeriod(1);
          timeKillEvent(TimerID) ;
        end;
      timeBeginPeriod(0);
      // ShowMessage(inttostr(self.Handle)); //dummy message: marche/marche pas !!
      TimerID := InitTimer; // marche si showmessage juste avant
    end;
    procedure TForm1.OnTimer;
    begin
      ShowMessage('Multimedia timer event');
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if TimerID<>-1 then
        begin
          timeEndPeriod(1);
          timeKillEvent(TimerID) ;
        end;
    end;
    end.
    Ca semble être un problème de handle ou autre...si quelqu'un pourrait trouver la solution à cet obscure problème ca serait...cool.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Plusieurs petite chose peuvent expliquer le fonctionnement bizard que tu
    site...

    1- TimerID est défini comme UINT et ne peu donc jamais etre égale à -1
    2- la premiere fois que tu appuie sur ton bouton, TimerID est égale à 0
    et un call à timeEndPeriod(1) et timeKillEvent est executer avec ZERO...
    3- Les appele entre timeBeginPeriod et timeEndPeriod doivent avoir le même
    paramètre... je propose donc l'utilisation d'une constante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    const
      //== Utilise un constante pour la resolution car on doit être ==
      //== consitent avec les appele de timeBeginPeriod et timeEndPeriod ==
      RES_TIMER=1;
     
    Procedure FNTimeCallback(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); Stdcall;
    Begin
      Form1.OnTimer;
    End;
     
    Function TForm1.InitTimer: MMRESULT; // equivaut a UINT
    Begin
      result := timeSetEvent(1000, RES_TIMER, FNTimeCallback, DWORD(self), Time_periodic);
    End;
     
    Procedure TForm1.OnTimer;
    Begin
      ShowMessage('Multimedia timer event');
    End;
     
     
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
     
      If TimerID <> 0 Then
      Begin
        //== au premier appele, TimerID=ZERO ==
        //== donc ce code ne s'execute pas ==
        timeEndPeriod(RES_TIMER);
        timeKillEvent(TimerID);
      End;
      timeBeginPeriod(RES_TIMER);
     
      TimerID := InitTimer; //TimerID<>0 si tout est OK
      if TimerID=0 then ShowMessage('Fail to setup Multimedia timer event!');
     
    End;
     
    Procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
    Begin
      If TimerID <> 0 Then
      Begin
        timeEndPeriod(RES_TIMER);
        timeKillEvent(TimerID);
      End;
    End;
    dit moi si ca fonctionne mieux...

  3. #3
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    Non , c'est incroyable , toujours le même problème.Le code corrigé ne marche que si j'ajoute le showmessage avant d'appeller la fonction InitTimer.Sans celà le timer n'est pas initialisé (ou alors le message de test n'est pas montré).

    Edit:
    En fait en utilisant MessageBox() à la place ca marche.Ca n'explique pas pourquoi ce code ne avec ShowMessage que s'il a déjà été utilisé dans le programme...

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par user 56gt8 Voir le message
    En fait en utilisant MessageBox() à la place ca marche.Ca n'explique pas pourquoi ce code ne avec ShowMessage que s'il a déjà été utilisé dans le programme...
    Dans les faits, c'est plus compliqué que ça n'y parait...
    En utilisant ce timer, ton application devient MultiThread....
    F1 sur timeSetEvent me donne ceci...
    The timeSetEvent function starts a specified timer event.
    The multimedia timer runs in its own thread.

    Donc la fonction callback du timer s'execute dans un thread différent de ton
    application...

    Tu dois faire très attention as ce que tu fais à l'interieur du timer car
    tu risque effectivement d'avoir des problèmes en manipulant des objets et
    ou variable qui appartiennent au Thread principal de ton application.
    techniquement, tu as besoin d'objet de synchronisation pour manipuler
    des variables dans 2 thread différents.

  5. #5
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    Merci , je crois que c'est bon cette fois.Le pire c'est que ce timer n'est pas assez précis poue ce que je veux faire.
    C'était sensé conduire une horloge midi.Le problème c'est qu'à 122 bpm par exemple , il faut 122*24 ticks par minutes , c'est à dire une horloge qui tique tout les 20,49180327868852459016393442623 millisecondes...et
    l'horloge multimedia n'a qu'une précision de 1 milliseconde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. threading.Timer stopper avec ouverture de fenetre
    Par bender86 dans le forum Général Python
    Réponses: 13
    Dernier message: 17/08/2011, 09h58
  2. threading.Timer stopper avec ouverture de fenetre
    Par bender86 dans le forum Tkinter
    Réponses: 0
    Dernier message: 31/07/2011, 15h29
  3. Timer Control avec WPF
    Par spamitovic dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/02/2010, 09h12
  4. Timer plus performant avec MMSystem
    Par gobgob dans le forum Delphi
    Réponses: 4
    Dernier message: 07/07/2006, 14h23
  5. Réponses: 4
    Dernier message: 30/12/2004, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo