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

VB.NET Discussion :

Précision timer


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut Précision timer
    Bonjour,

    J'aurais besoin pour mon application d'un timer plus performant (interval ~1ms) que celui proposé par le framework (System.Windows.Form.Timer, ~18ms je crois).

    J'ai commencé à écrire une classe mais mon problème c'est que quand je le lance, il monopolise les ressources, aucun traitement ne ce fait en parallèle.. J'ai testé avec un Application.DoEvents mais ça ne marche pas non plus..

    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
    Imports System.Threading
     
    Public Class CycleTimer
        Private Declare Function timeGetTime Lib "winmm.dll" () As Integer
        Private Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Integer) As Integer
        Private Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Integer) As Integer
        Private state As TimerState = TimerState.Stop
        Private threadStart As ParameterizedThreadStart
        Private timeStart As Long = 0
     
     
        Sub New(start As ParameterizedThreadStart)
            Me.threadStart = start
        End Sub
     
        Sub [Start](Optional period As Integer = 1)
            state = TimerState.Start
            timeBeginPeriod(period)
            timeStart = timeGetTime
            While state = TimerState.Start
     
                threadStart.Invoke(New Object() {})
     
                Threading.Thread.Sleep(period)
            End While
            timeStart = -1
            timeEndPeriod(period)
        End Sub
     
        Sub [Stop]()
            state = TimerState.Stop
        End Sub
     
        Function GetTime() As Long
            If timeStart <> -1 Then
                Return timeGetTime - timeStart
            Else
                Return -1
            End If
        End Function
     
        Private Enum TimerState
            [Start]
            [Stop]
        End Enum
     
    End Class
    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Qu'entends tu par "performant" ? Je suppose que tu parles plutôt de sa précision...

    Citation Envoyé par -N4w4k- Voir le message
    J'aurais besoin pour mon application d'un timer plus performant (interval ~1ms) que celui proposé par le framework (System.Windows.Form.Timer, ~18ms je crois).
    System.Windows.Form.Timer n'est que l'un des timers proposés par le Framework... et il est imprécis pour une raison très simple : l'évènement Tick se déclenche toujours sur le thread UI, donc si le thread UI est occupé à autre chose à ce moment là, ça retarde le déclenchement du timer.

    Pas la peine d'implémenter un nouveau timer, il y a déjà 2 classes qui devraient répondre à ton besoin :
    System.Timers.Timer
    System.Threading.Timer

    Il y a un article ici avec une comparaison détaillée :
    http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

  3. #3
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Salut tomlev,

    en fait je suis en train de faire un logiciel de supervision qui a besoin de lire/écrire des entrées/sorties avec une grande précision.
    Après quelques essais, le System.Windows.Form.Timer me semblait pas assez précis (je comprend maintenant pourquoi grâce à ton explication).

    Je vais lire le comparatif que tu as mis en lien, mais à tout hasard, est ce qu'une solution est plus utilisée que d'autres pour ce genre de besoin?

    EDIT: Le System.Threading.Timer à l'air de correspondre à mes besoins d'après msdn:
    Le délégué de la minuterie est spécifié lors de la construction de cette dernière et ne peut pas être modifié. La méthode ne s'exécute pas dans le thread qui a créé la minuterie, mais dans un ThreadPool thread du pool fourni par le système.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Perso j'ai une préférence pour System.Timers.Timer, qui a un modèle objet plus intuitif. La principale raison de préférer System.Threading.Timer, c'est si tu as besoin de contrôler à quel moment le timer se déclenche pour la première fois (paramètre dueTime)

  5. #5
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    J'étais parti sur l'autre ^^

    En fait, je ne pense pas que mon problème vienne du timer.. Après le changement du System.Windows.Form.Timer en System.Threading.Timer, j'ai toujours le même problème. Les entrées ne sont apparemment pas lues assez souvent et tout les changements d'état de celles-ci ne sont pas pris en compte..

    Je vais essayer dans une application console qui demandera peut être moins de ressources que mon application winforms.. J'espère qu'il y aura une différence car pour l'instant je ne sais pas du tout où se trouve mon erreur..

    Dans le cas où je ne trouverais pas, je vous en dirais un peu plus sur ma démarche.

    Merci pour ces réponses.

  6. #6
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Bon bah je n'ai aucun changement.. J'ai ce problème depuis hier matin

    Je ne sais plus où chercher.. Je vous post mon programme (appli console), peut être que vous pourrez me dire ce qui fait que tout les changements d'état des entrées ne sont pas pris en compte..

    Main module:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Imports System.Timers
    Imports ABW_IO_Manager
     
    Module Module1
     
        'Cycle
        Private CurrentCycle As BaseCycle = New CurrentCycle
        Private ExecutionTimer As Timer
     
        'InputReader / OutputWriter
        Dim IOManager As IOManager = IOManager.GetInstance()
     
        Sub Main()
            Try
                'Init IO
                IOManager.InitInputs(CurrentCycle.FirstInput, CurrentCycle.LastInput)
                IOManager.InitOutputs(CurrentCycle.FirstOutput, CurrentCycle.LastOutput)
                'Init Cycle
                CurrentCycle.Inputs = IOManager.Inputs
                CurrentCycle.Outputs = IOManager.Outputs
                CurrentCycle.Init()
                'Init timer
                ExecutionTimer = New Timer(1)
                AddHandler ExecutionTimer.Elapsed, AddressOf Execute
     
                'Start timer
                ExecutionTimer.Enabled = True
     
                'Stop
                Console.WriteLine("Please Press any key to continue!")
                Console.ReadKey()
     
                'Deinit cycle
                CurrentCycle.Deinit()
                Threading.Thread.Sleep(100)
     
                'Stop timer
                ExecutionTimer.Enabled = False
     
            Catch ex As Exception
                Console.WriteLine(ex.Message)
                Console.WriteLine("Please Press any key to continue!")
                Console.ReadKey()
            End Try
        End Sub
     
        Sub Execute()
            Try
                IOManager.ReadInputs()
                CurrentCycle.Execute()
                IOManager.WriteOutputs()
     
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Sub
     
    End Module
    J'ai fais ça tout seul, et c'est là première fois que je le fais donc si vous avez une quelconque remarque, je suis preneur..

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Peut-être que la méthode Execute prend trop longtemps à s'exécuter (plus que l'intervalle entre 2 déclenchements du timer)

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

Discussions similaires

  1. Timer haute précision
    Par chris069 dans le forum C++
    Réponses: 3
    Dernier message: 29/04/2009, 15h53
  2. Problème de précision avec un Timer
    Par cs_ntd dans le forum C#
    Réponses: 7
    Dernier message: 29/06/2008, 23h51
  3. Sleep() et Timer grande précision
    Par jacklafrip dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2007, 12h29
  4. [C++ Builder 6] Timer de précision pour chronomètre
    Par doudoustephane dans le forum C++Builder
    Réponses: 9
    Dernier message: 27/09/2005, 10h45
  5. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21

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