Hallo!
Was genau Du vorhast, ist nicht klar. Kommunikation zwischen Threads, Programmen, Rechnern ...?
Im Prinzip sollte die Interprozess-Kommunikation durch binär-Serialisierbare Klassen
zu erledigen sein. Hier ein simples Beispiel für die Übertragung einer Datatable
zwischen zwei Threads per NamedPipes.
Zugriffe auf Controls von ausserhalb des UI-Thread erfordern ein Invoke (Delegat).
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO.Pipes
Imports System.Threading
Imports System.ComponentModel
Public Class frmPipe
Dim dgv As New DataGridView With {.Parent = Me}
Delegate Sub Tabledelegate(ByVal dt As DataTable)
Private Sub frmPipe_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'NamedPipe-Threads starten
Dim st As New Thread(AddressOf serverthread)
st.Start()
Dim ct As New Thread(AddressOf clientthread)
ct.Start()
End Sub
Private Sub serverthread()
'Testdaten erstellen
Dim dt As New DataTable
With dt
.Columns.Add("SP1")
.Columns.Add("SP2")
.Columns.Add("SP3")
.Rows.Add("11", "12", "13")
.Rows.Add("21", "22", "23")
.Rows.Add("31", "32", "33")
End With
'Übertragung der Datatable
'Serialisierung der Datatable in einen Memorystream
Dim bf As New BinaryFormatter
Dim ms As New IO.MemoryStream
bf.Serialize(ms, dt)
Dim bl As Integer = ms.ToArray.Length 'Byte-Länge notieren
'zu sendende Bytelänge in Bytearray wandeln
Dim blb As Byte() = BitConverter.GetBytes(bl)
'NamedPipe für das Senden der Tabelle erstellen
Dim server As New NamedPipeServerStream("PipeTable")
server.WaitForConnection()
'Byte-Arrays übertragen (senden)
server.Write(blb, 0, blb.Length) 'Länge
server.Write(ms.ToArray, 0, bl) 'Datatable-Serialisierung
End Sub
Private Sub clientthread()
'NamedPipe für den Datenempfang
Dim client As New NamedPipeClientStream("PipeTable")
client.Connect()
'Byte-Länge lesen
Dim blb(4) As Byte
client.Read(blb, 0, 4)
Dim bl As Integer = BitConverter.ToInt32(blb, 0)
'Array für die empfangenen Daten
Dim buffer(bl) As Byte
client.Read(buffer, 0, bl) 'Datatable-Serialisierung lesen
'Deserialisieren des Byte-Array
Dim msc As New IO.MemoryStream(buffer)
Dim bfc As New BinaryFormatter
Dim dtc As DataTable = _
CType(bfc.Deserialize(msc, Nothing), DataTable)
'Anzeige der erhaltenen Datatable-Daten im Grid
Me.Invoke(New Tabledelegate(AddressOf showtable), dtc)
End Sub
Private Sub showtable(ByVal dt As DataTable)
dgv.DataSource = Nothing
dgv.DataSource = dt
End Sub
End Class
Beitrag wurde zuletzt am 27.05.15 um 06:21:47 editiert. |