Bonjour,

Je tente d'écrire une application de chat rustique pour mon boulot.

J'utilise Visual basic 2010 express.

L'application est multi instance (sinon ça sert à rien). Quand un utilisateur envoi un post il s'ajoute simplement à un fichier texte chat.txt.
Les différentes instances de l'application rafraichissent leurs affichages toutes les 5 secondes.

Comme la lecture/écriture se fait dans un seul fichier (situé sur un serveur), j'ai voulu sécuriser en mettant en place un système de jeton artisanal.
Lorsqu'une instance veut écrire, elle attend (pendant pas plus de 6 secondes) la présence d'un fichier jeton.txt sur le serveur.
S'il est présent, l'instance le supprime, réalise son écriture puis le recrée. C'est rustique, je le concède.

Mon code fonctionne pour la première écriture mais pour les autres. J'ai une erreur lors de la tentative de destruction du fichier "Le processus ne peut pas accéder au fichier car il est en cours d'utilisation par un autre processus". Le test est fait en mono instance.

Je dois mal m'y prendre avec la suppression/re-création du fichier Jeton.txt.

Pourriez-vous m'aider svp ? Je suis en plein désespoir !

Ci dessous un code de test qui reproduit parfaitement l'erreur.


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
59
60
61
62
63
 
Imports System.IO
 
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        StrNomFichier = "E:\Visual Basic\Projet\Test\Test_Fichier\Chat.txt"  'variable globale
        strNomJeton = "E:\Visual Basic\Projet\Test\Test_Fichier\Jeton.txt"	'variable globale
 
    End Sub
 
    Private Sub Btn_AddPost_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_AddPost.Click
 
        Dim strPost As String
 
        strPost = "y voilà : " & TimeOfDay
 
        If AttrapeJeton() Then
            My.Computer.FileSystem.WriteAllText(StrNomFichier, strPost & vbCrLf, True)
            File.Create(strNomJeton)
        End If
 
    End Sub
 
    Private Function AttrapeJeton() As Boolean
 
        Dim Count As Integer
        Dim Laps As Integer
 
        Count = 0
        Laps = 300
 
        While (Not File.Exists(strNomJeton))
            Count += 1
            Threading.Thread.Sleep(Laps)
 
            If Count > 20 Then
                'Attente trop longue
                MsgBox("Erreur AttrapeJeton() : Attente trop longue pour le jeton demandé.")
                Return False
            End If
 
        End While
 
        'Si on arrive ici c'est  que le fichier strNomJeton existe
        Try
            File.Delete(strNomJeton)
        Catch ex As Exception
            MsgBox("Erreur AttrapeJeton() : le jeton demandéa disparu" & ex.Message)
            Return False
        End Try
 
        Return True
 
    End Function
 
    Private Sub Btn_Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Quitter.Click
        End
    End Sub
 
 
End Class