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

Windows Forms Discussion :

Enregistrement de données avec base de temps


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut Enregistrement de données avec base de temps
    Bonsoir à tous,

    Je souhaite enregistrer dans un fichier texte la date et l'heure suivant un intervalle de temps pouvant être choisi via 3 listbox (heure / minute / seconde)

    J'ai lu que l'utilisation d'un timer pour ce type de travail n'est pas souhaitable, de plus les données pourraient être enregistrées avec un intervalle de temps allant de 1 seconde à 24h

    Pour faire simple, l'intervalle de temps serait une variable, par exemple 1 minute... Par la suite j'affecterai celle-ci au résultat de la sélection des listbox...

    Faut-il passer par un thread?
    Faut-il utiliser un timespan?
    Pensez-vous qu'il faille passer par une boucle qui incrémente la date du début de l'enregistrement? Cette incrémentation se ferait en additionnant l'heure de départ à l'intervalle de temps choisi?

    Auriez vous une piste?

    Merci à vous

    Cordialement
    Lio

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Dans beaucoup de cas, un timer peut parfaitement faire l'affaire.

    Si l'on doit absolument faire en sorte que le nombre de traitement sur une période soit parfaitement déterminé (exemple : 24 x 60 x 3 enregistrements par jour pour un intervalle de 20 secondes), on pourra utiliser un timer de fréquence plus élévée (0.5 seconde dans l'exemple précédent) et, sur chaque tick, tester si le temps écoulé depuis le départ est supérieur à n intervalles (en commençant avec n=1), si la condition est vérifiée on enregistrre et on incrémente n.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci Graffito pour votre réponse!
    Je crains ne pas avoir bien compris ou alors, je me suis mal exprimé....

    Ce que je souhaite faire c'est enregistrer des données toutes les x secondes ou x minutes ou x heures (en fonction du choix de l'utilisateur). Effectivement le timer pour un intervalle de temps de quelques secondes, cela peut fonctionner, en revanche si l'utilisateur souhaite un enregistrement toutes les 5 heures...

    J'ai essayé d'affecter une variable prenant l'intervalle de temps et par la suite comparer les heures ...
    Vardepart = temps de départ
    Varinterval = intervalle
    Varact = temps du moment

    si Varact = Vardepart + Varinterval alors
    enregistrement des données

    L'idée est-elle correcte ou alors faut-il voir le problème autrement?
    Cordialement
    Lio

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Non ton idée est correct quoique je nommerai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DateTime DtLastWrite;
    TimeSpan Intervale;
     
    if(DateTime.Now-dtLastWriteTime>Interval) 
    {
    DtLastWriteTime=DateTime.Now();
    SaveData();
    }
    mais le timer me semble plus propre et facile a utilisé
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci Benoît,

    Ok pour le timeSpan, je teste cela dès que je peux, merci à vous...
    Je vous tiens informé...
    Lio

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    C'est bien l'idée d'utiliser un timer et d'effectuer un calcul sur la différence de temps qui est la plus simple.

    Pour un intervalle de temps IT, on peut prendre un timer égal à IT/100.

    On vérifie à chaque tick si le temps écoulé (Tn+1 - Tn) depuis le dernier enregistrement est supérieur à IT-IT/1000 ou, pour éviter des déviations cumulées, si (Tn+1-T0)> n*IT -T/1000.
    Le terme -IT/1000 permet de prendre en compte l'approximaton sur le déclenchement du timer.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Humm tu n'as pas confiance au timer.Tick si tu le règles simplement sur l'interval défini par l'utilisateur?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    En principe, dans le traitement d'un event Timer, on déactive le timer à l'entrée et on le réarme à la sortie. De ce fait, le temps de traitement de l'event n'est pas comptabilisé.

    Sans compter, les dérives dues à l'imprécision de la conversion ticks/millisecondes.

    Dans la plupart des appli, une imprécision sur les délais est sans conséquence sur des traitement périodiques.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Oki doki
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Bonsoir,

    Après quelques essais avec un calcul sur la différence de temps, je me suis tourné vers le timer...
    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
     
    Imports System.IO
     
    Dim Ecriture As New StreamWriter("Enregistrement1.txt")
     
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim RecTime As Date = Date.Now
            Timer1.Interval = 1000
     
            Ecriture.WriteLine(RecTime.ToShortDateString & ";" & RecTime.ToLongTimeString ) 'erreur sur cette ligne'
        End Sub
     
     
        Private Sub BT_Enregistrement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Debut_Enregistrement.Click
            BT_Debut_Enregistrement.Enabled = False
            BT_Fin_Enregistrement.Enabled = True
            Timer1.Start()
            Ecriture.WriteLine("Date" & ";" & "Heure") 
        End Sub
     
        Private Sub BT_Fin_Enregistrement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Fin_Enregistrement.Click
            Timer1.Stop()
            Ecriture.Flush()
            Ecriture.Close() 'je pense que c est à cause de cette commande'
            BT_Debut_Enregistrement.Enabled = True
            BT_Fin_Enregistrement.Enabled = False
        End Sub
    J'ai placé un bouton pour le début de l'enregistrement et un autre pour la fin...
    Les enregistrements se font, dans cet exemple, toutes les secondes...

    Aussi, je ne vois pas comment arrêter proprement le streamwriter.
    Lorsque j'exécute, je lance l'enregistrement, j'attends, je l'arrête et lorsque je souhaite le reprendre, j'ai une erreur me disant :
    L'exception ObjectDesiposedException n'a pas été gérée
    Impossible d'écrire dans un TextWriter fermé.
    Evidemment, lorsque je supprime la ligne :
    cela fonctionne...
    Comment peut-on fermer le streamwriter proprement?
    La commande me fait la même erreur, car elle ferme le streamwriter après avoir purgé le buffer, c'est bien cela?
    Merci
    Lio

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    C'est parce que tu ne réouvres pas le fichier qu'il rale.
    Il faut ouvrir le fichier quand tu clicks sur Start (et non au lancement de l'application) File.Open()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Private Sub BT_Enregistrement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Debut_Enregistrement.Click
            BT_Debut_Enregistrement.Enabled = False
            BT_Fin_Enregistrement.Enabled = True
            Timer1.Start()
            Ecriture=File.Open("log.txt",FileMode.Append)
            Ecriture.WriteLine("Date" & ";" & "Heure") 
        End Sub
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci Benoît,
    J'ai bien cherché à ré-ouvrir le fichier, mais j'utilise system.IO.streamwriter et non system.IO.filestream...
    Donc en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Ecriture=File.Open("Enregistrement1.txt",FileMode.Append)
    j'ai une erreur
    Impossible de convertir une valeur de type 'System.IO.FileStream' en 'System.IO.StreamWriter'
    Alors, je me suis mal exprimé... Comment ré-ouvrir le fichier quand on utilise "system.IO.streamwriter"?
    J'ai consulté msd, mais n'ai rien trouvé... Je pensais que le fait d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ecriture.WriteLine("Date" & ";" & "Heure" )
    ouvrait "automatiquement" le streamwriter... hélas non...
    Une idée?
    Cordialement
    Lio

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    change Dim Ecriture As New StreamWriter en Dim Ecriture As FileStream

    ou sinon tu fais Ecriture = New StreamWriter("tonfichier.txt")
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Merci...
    Mais la solution ne serait pas d'utiliser "Using"?
    Quelle est donc la différence entre filestream et streamwriter?
    J'ai compris que "streamwriter" gère des flux de données, est-ce bien cela?
    Et justement, j'enregistre des flux de données provenant du port série....
    Lio

  15. #15
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    StreamWriter est un flux générique pour l'écriture.

    FileStream est un flux spécialisé pour les fichiers

    Le using à l'avantage d'appeler le dispose à coups sur part contre le using se limite à un block donc pas utilisable dans ton cas

    Pour le port tu utilises un StreamWriter pour le fichier tu utilises un FileStream
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Ok, donc j'abandonne le system.streamwriter et opte pour system.filestream...
    Donc, je revois ma copie et vous tiens au jus...
    J'avais essayé avec filestream, mais peu concluant.... je réessaye...
    Lio

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    jsuis perdu....
    Filestream est utilisé pour les bases de données, non?
    Là, plus rien ne fonctionne....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Ecriture As FileStream
        Const FichierEcriture As String = "Enregistrement1.txt"
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim RecTime As Date = Date.Now
            Timer1.Interval = 1000
            Ecriture = File.Open(FichierEcriture, FileMode.Append)
    '...'
    là , je ne vois pas comment écrire 'RecTime.ToShortDateString & ";" & RecTime.ToLongTimeString'
    car Ecriture.write me demande un tableau

  18. #18
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    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
     
    Imports System.IO
     
    Const FileName As String = "Enregistrement1.txt"
     
    Dim Ecriture As StreamWriter
     
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim RecTime As Date = Date.Now
            Timer1.Interval = 1000
     
            Ecriture.WriteLine(RecTime.ToShortDateString & ";" & RecTime.ToLongTimeString ) 'erreur sur cette ligne'
        End Sub
     
     
        Private Sub BT_Enregistrement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Debut_Enregistrement.Click
            BT_Debut_Enregistrement.Enabled = False
            BT_Fin_Enregistrement.Enabled = True
            Ecriture = new StreamWriter(FileName)
            Ecriture.WriteLine("Date" & ";" & "Heure") 
            Timer1.Start()
        End Sub
     
        Private Sub BT_Fin_Enregistrement_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Fin_Enregistrement.Click
            Timer1.Stop()
            Ecriture.Flush()
            Ecriture.Close() 
            BT_Debut_Enregistrement.Enabled = True
            BT_Fin_Enregistrement.Enabled = False
        End Sub
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Points : 41
    Points
    41
    Par défaut
    Ok, bien vu.... Bon, bon, bon.... Cela fonctionne....
    Vous m'aviez donné toutes les pistes, mais je n'ai pas su les placer...
    Je ne peux que vous remercier... Merci Benoît!
    Donc résolu....
    Cordialement
    Lio

  20. #20
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    De rien

    (C'est surtout parce que je vous ai conseiler le FileStream et qu'en verifiant je ne l'utilise pas )
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 31/05/2011, 16h53
  2. enregistrer les données avec le binding navigateur
    Par adel.87 dans le forum Débuter
    Réponses: 11
    Dernier message: 08/10/2008, 16h15
  3. Insérer une décomposition image par image avec base de temps en légende
    Par guifon1000 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 09/06/2008, 10h07
  4. InfoPath envoie et reception de données avec base SQL
    Par fanfan49 dans le forum InfoPath
    Réponses: 2
    Dernier message: 05/06/2007, 15h44
  5. Réponses: 18
    Dernier message: 10/07/2006, 13h42

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