StreamWriter flush fige mon programme [Résolu]

Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
- - Dernière réponse : VbNicoG
Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
- 9 juil. 2019 à 09:17
Bonjour à tous,

J'ai remarqué que la méthode "flush" d'un objet "streamWriter" peut me figer le programme pendant 2 à 3 minutes et cela sans lever d'exception.
J'écris une ligne dans un fichier toutes les 250ms.
Voici le code :
    Private Sub SaveRecord()
        Dim stp, KeyHisNum As String
        Dim ss As StreamWriter

        Try
            ' Pause record during shift historical
            If Not gPauseRecord Then
                ' Write record point
                NumberRecord = NumberRecord + 1
                KeyHisNum = KEY_RECORD & NumberRecord.ToString
                stp = NumberRecord.ToString & LIST_SEPARATOR
                stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFields, True)

                ss = File.AppendText(FullFileName)
                ss.WriteLine(KeyHisNum & "=" & stp)
                ss.Flush()
            End If
        Catch ex As Exception
            AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
        Finally
            If Not gPauseRecord Then
                ss.Close()
            End If
        End Try
    End Sub


Lorsque le programme se fige, je force la pause, et je m'aperçois qu'il est bloqué sur la ligne "ss.Flush()".
Je ne suis pas certain que ce vidage de buffer soit complètement utile, peut être que le ss.close() suffit à libérer la mémoire ?
A noter que j'ai 2 écritures de fichier différents, une toutes les 250ms et une autre toutes les secondes. J'utilise une autre instance de streamwriter, donc je ne pense pas qu'ils s'emmèlent.
Le freeze arrive 1 à 2 fois par heure aléatoirement mais le programme est bloqué pendant 2 à 3 minutes et c'est critique dans mon cas...

Est ce que quelqu'un peut m'éclairer sur ce problème ?
Merci d'avance.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
1985
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2019
79
1
Merci
bonjour !
Tu peux supprimer le
ss.Flush()
sans problème ( à moins que tu ne veuilles voir en temps réel ce qui est inscrit sur le disque mais je ne pense pas )
Flush() écrit le buffer sur disque et toutes les 250 ms cela peut ralentir et même bloquer ton programme
Surtout que Close() vide le buffer sur disque et ferme le flux d'écriture !

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS SourceS

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vb95
Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
0
Merci
Bonjour vb95,

Merci pour ta réponse, cela explique clairement le problème que j'observe!
Le fichier peut être ouvert et lu pendant cet enregistrement, ça fonctionne bien.
Quand tu parles de temps réel, as tu un ordre d'idée du décalage lorsque l'on utilise pas la fonction flush ? Je ne me rends pas compte, sachant que si j'ai 10 secondes de décalage, c'est pas la mort.

--
vb95
Messages postés
1985
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2019
79 -
Bonjour !
Pour le temps réel voici ce que je pense
1) tu initialises ton StreamWriter
2) tu écris ta première ligne du fichier dans le StreamWriter
3) tu fais un Flush : cette ligne est dans le fichier sur disque
C'est là que tu peux voir en temps réel les datas sur disque alors que sans le Flush c'est au Close du StreamWriter que toutes les données sont inscrites sur le disque et en attendant ce Close elles restent en mémoire dans le StreamWriter ..
Il faut reconnaître que Flush est très rarement utilisé
Il n'est nullement question de décalage
C'est un peu comme sur un compte en banque : tu achètes avec ta Carte Bleu et l'achat n'est pas déduit immédiatement sur ton compte ( ton achat est dans le "StreamWriter" de ta banque )
Tous les jours pendant le nuit la Banque "Close" ton compte : tes achats sont débités de ton compte
Si la banque faisait un "Flush" à chaque opération cela serait du débit immédiat et non différé .
Penses à clôturer cette discussion avec la roue dentée en haut à droite de ton post !
A +
Merci, c'est compris! Je fais le "close" juste derrière donc raison de plus de ne pas faire le "flush".
Sujet cloturé, encore merci!
vb95
Messages postés
1985
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
14 décembre 2019
79 -
Tu peux même simplifier ton code
Private Sub SaveRecord()
      Dim stp, KeyHisNum As String
      Dim ss As StreamWriter
      ' Pause record during shift historical
      If Not gPauseRecord Then
             Try
                    ' Write record point
                    NumberRecord = NumberRecord + 1
                    KeyHisNum = KEY_RECORD & NumberRecord.ToString
                    stp = NumberRecord.ToString & LIST_SEPARATOR
                    stp &= Historical_V3.EncodeOneRecord_V3(HistoricalFields, True)

                    ss = File.AppendText(FullFileName)
                    ss.WriteLine(KeyHisNum & "=" & stp)
             Catch ex As Exception
                    AuditTrail_WriteEvent("ERR,Failed to log history record." & FullFileName)
             Finally
                    ss.Close()
             End Try
        End If

    End Sub


pourquoi mettre 2 fois
If Not gPauseRecord 
VbNicoG
Messages postés
127
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 septembre 2019
-
Bonjour vb95,

Merci de ta réponse j'en ai profité pour simplifier le programme comme tu le proposais!
Par contre, j'ai toujours l'application qui se fige mais maintenant au ss.close(). A priori moins souvent que lorsque j'avais la méthode flush mais cela arrive toujours.
Une idée ?
Commenter la réponse de VbNicoG