Hallo iedereen,
Ik heb een vraag over een multithread applicatie dat ik aan het schrijven was in vb.net. Ik heb een code aangepast die ik gevonden heb op internet om data over een netwerk te sturen. Ik heb de code origineel van een programma waar de code origineel op een formulier stond. Ik heb al alles verwerkt, en er een klasse van gemaakt om dit vaker te gebruiken.
Maar nu komt het probleem. Ik zou dit ook willen verwerken in ddl omdat dit gemakkelijker te gebruiken is, vind ik persoonlijk. Maar als ik de klasse importeer in een class-library zijn er bepaalde types die hij niet meer herkent. Zoals 'Form' (zie de declaratie van 'main', functie 'sendToMain()' & 'serverDis()' ). Ik heb dit nodig om een invoke te doen om de event te initialiseren. Ik vind nergens een manier om dit op te lossen, te omzeilen. Ik heb natuurlijk ook gedacht om de multithread code te implementeren iedere keer in het formulier, maar het moet toch mogelijk zijn om dit de dll te voorzien.
Dan heb ik ook nog een ander probleempje. Bij het afsluiten worden de sub 'endConnection()' opgeroepen. Maar de thread wil niet afsluiten, waardoor ik het programma op zijn geheel niet kan afsluiten. Het hoofdformulier kan worden afgesloten, maar het proces blijft draaien... Heeft daar iemand ook een oplossing voor. Ik heb al vanalles geprobeert, maar ik vind het maar niet
bedankt op voorhand
edit: de code moet nog wat optimalisatie, maar ik zou eerst die willen oplossen
TCPClient.vb
Ik heb een vraag over een multithread applicatie dat ik aan het schrijven was in vb.net. Ik heb een code aangepast die ik gevonden heb op internet om data over een netwerk te sturen. Ik heb de code origineel van een programma waar de code origineel op een formulier stond. Ik heb al alles verwerkt, en er een klasse van gemaakt om dit vaker te gebruiken.
Maar nu komt het probleem. Ik zou dit ook willen verwerken in ddl omdat dit gemakkelijker te gebruiken is, vind ik persoonlijk. Maar als ik de klasse importeer in een class-library zijn er bepaalde types die hij niet meer herkent. Zoals 'Form' (zie de declaratie van 'main', functie 'sendToMain()' & 'serverDis()' ). Ik heb dit nodig om een invoke te doen om de event te initialiseren. Ik vind nergens een manier om dit op te lossen, te omzeilen. Ik heb natuurlijk ook gedacht om de multithread code te implementeren iedere keer in het formulier, maar het moet toch mogelijk zijn om dit de dll te voorzien.
Dan heb ik ook nog een ander probleempje. Bij het afsluiten worden de sub 'endConnection()' opgeroepen. Maar de thread wil niet afsluiten, waardoor ik het programma op zijn geheel niet kan afsluiten. Het hoofdformulier kan worden afgesloten, maar het proces blijft draaien... Heeft daar iemand ook een oplossing voor. Ik heb al vanalles geprobeert, maar ik vind het maar niet
bedankt op voorhand
edit: de code moet nog wat optimalisatie, maar ik zou eerst die willen oplossen
TCPClient.vb
Visual Basic .NET:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
| Imports System.Net.Sockets Imports System.Text Public Class TCPClient Private clientSocket As New System.Net.Sockets.TcpClient() Private serverStream As NetworkStream Private readData As String Private infiniteCounter As Integer Private ctThread As Threading.Thread Private t As Boolean = True Private main As Form Public Event dataArrival(ByVal data As String) Public Event serverDisconnected() Sub New(ByVal main As Form) Me.main = main End Sub Public Sub sendData(ByVal data As String) Try Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes(data + "$") serverStream.Write(outStream, 0, outStream.Length) serverStream.Flush() Catch ex As Exception Throw New Exception("There is no connection with a server") End Try End Sub Private Sub sendToMain() If main.InvokeRequired Then main.Invoke(New MethodInvoker(AddressOf sendToMain)) Else RaiseEvent dataArrival(readData) End If End Sub Private Sub serverDis() If main.InvokeRequired Then main.Invoke(New MethodInvoker(AddressOf serverDis)) Else RaiseEvent serverDisconnected() End If End Sub Public Sub connectServer(ByVal ip As String, ByVal port As Integer, ByVal nick As String) Try readData = "Connected to Chat Server ..." sendToMain() clientSocket.Connect(ip, port) serverStream = clientSocket.GetStream() Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes(nick + "$") serverStream.Write(outStream, 0, outStream.Length) serverStream.Flush() ctThread = New Threading.Thread(AddressOf getMessage) ctThread.Start() Catch ex As Exception Throw New Exception("Server is not available") End Try End Sub Private Sub getMessage() While True Try serverStream = clientSocket.GetStream() Dim buffSize As Integer Dim inStream(10024) As Byte buffSize = clientSocket.ReceiveBufferSize serverStream.Read(inStream, 0, buffSize) Dim returndata As String = System.Text.Encoding.ASCII.GetString(inStream) readData = returndata sendToMain() Catch ex As Exception t = False serverDis() End Try End While End Sub Public Sub endConnection() clientSocket.Close() If Not ctThread Is Nothing Then If ctThread.IsAlive Then ctThread.Abort() End If End If End Sub End Class |