Bonjour

J'ai un programme A et un programme C.

-Mon programme A est client. (Et aussi un service)

-Mon programme C est serveur.


Dans A, il y a un Thread qui essaye constamment de se connecter.

Dans C, il y a un Thread qui check tout le temps si il y a un client qui se connecte.



Thread du Programme A :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    Dim VariableLock1 As Object = New Object()
    Public Sub FonctionThreadPipeConnect()
        SyncLock VariableLock1
            While True
                While Not clientPipe.IsConnected
                    clientPipe.Connect()
                End While
            End While
        End SyncLock
    End Sub


Thread du Programme C :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    Dim VariableLock1 As Object = New Object()
    Public Sub FonctionThreadPipeConnect()
        SyncLock VariableLock1
            While True
                While Not serverPipe.IsConnected
                    serverPipe.WaitForConnection()
                End While
            End While
        End SyncLock
    End Sub


Dans A, quelque part dans une fonction, je fais un write :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 
        Dim B() As Byte = System.Text.Encoding.GetEncoding("windows-1256").GetBytes("Aucune donnée à télécharger, veuillez retirer le lecteur")
 
 
 If clientPipe2.IsConnected Then
                                clientPipe2.Write(B, 0, B.Length)
                            End If
Dans C, quelque part dans le code, je fais un read :

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
 Dim VariableLock2 As Object = New Object()
    Public Sub FonctionThreadRead()
        SyncLock VariableLock2
 
 
            While serverPipe.IsConnected
                Dim B(0 To 1000) As Byte
                Dim L As Integer = serverPipe.Read(B, 0, B.Length)
                ReDim Preserve B(0 To L - 1)
                'MsgBox(System.Text.Encoding.GetEncoding("windows-1256").GetString(B))
 
                MessageBox.Show(System.Text.Encoding.GetEncoding("windows-1256").GetString(B), "ERTool", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification)
 
 
            End While
 
            serverPipe.Close()
 
        End SyncLock
 
 
    End Sub

Le tout fonctionne, si j'exécute C après A...

Si je quitte C, A plante et dis : "canal endommagé" quand il essaye de faire un "write"

Pourtant, dans le FormClosing, je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    Private Sub ERToolMsg_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
         serverPipe.Disconnect()
    End Sub
Il doit y avoir un truc que j'ai zappé.

Help !! Thanks