StreamWriter flush fige mon programme

Résolu
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019 - 23 mars 2019 à 15:03
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.
A voir également:

2 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 23 mars 2019 à 18:30
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 !

1
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
24 mars 2019 à 12:43
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.

--
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 24 mars 2019 à 14:03
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 +
0
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!
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
25 mars 2019 à 14:18
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 
0
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 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 ?
0
Rejoignez-nous