Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports System.IO
- Imports System.IO.MemoryMappedFiles
- Imports System.Threading
- Public Class Sender
- Implements IDisposable
- Private ReadOnly Name As String
- Public Function Send(ByVal Bytes() As Byte) As Boolean
- Return Send(Bytes, Name)
- End Function
- Public Shared Function Send(ByVal Bytes() As Byte, ByVal Name As String, Optional ByVal TimeOut As Integer = 0) As Boolean
- Using SingleOut As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":SendSingleOutMutex")
- Try
- If SingleOut.WaitOne(TimeOut) AndAlso CheckForReader(Name) Then
- Using mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("MemoryMappedComms:712247:" & Name & ":Data", Bytes.Length)
- Using mmfv As MemoryMappedViewStream = mmf.CreateViewStream
- Using bw As New BinaryWriter(mmfv)
- bw.Write(Bytes)
- End Using
- End Using
- Using Signal As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":Signal")
- Using WaitForTransfer As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":WaitForTransfer")
- Using StatMutex As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":StatusMutex")
- Signal.Set()
- WaitHandle.WaitAny({WaitForTransfer, StatMutex}) 'Only waits if the Reader is present
- End Using
- End Using
- End Using
- End Using
- Return True
- End If
- Catch ex As Exception
- End Try
- End Using
- Return False
- End Function
- Private Shared Function CheckForReader(ByVal Name As String) As Boolean
- Try
- Using mmfc As MemoryMappedFile = MemoryMappedFile.OpenExisting("MemoryMappedComms:712247:" & Name & ":Presence")
- Return True
- End Using
- Catch ex As Exception
- Return False
- End Try
- End Function
- Public Sub New(ByVal Name As String)
- Me.Name = Name
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose : End Sub 'Only have this implemented to that when writing code we can use the "using" keyword
- End Class
- Public Class Receiver
- Implements IDisposable
- Public Event BytesReceived(ByVal Bytes() As Byte)
- Private Name As String
- Private Running As Boolean = True
- Private CommunicationsThread As Thread
- Public Sub New(ByVal Name As String)
- Me.Name = Name
- CommunicationsThread = New Thread(Sub()
- Using SingleOut As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":RecvSingleOutMutex")
- Try
- SingleOut.WaitOne() 'Waits for the token (this allows only one reader at any given time with the same name)
- Catch ex As Exception
- End Try
- Try
- Using Presence As MemoryMappedFile = MemoryMappedFile.CreateNew("MemoryMappedComms:712247:" & Name & ":Presence", 1)
- Using StatMutex As New Mutex(True, "MemoryMappedComms:712247:" & Name & ":StatusMutex")
- While Running
- Using Signal As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Me.Name & ":Signal")
- Signal.WaitOne()
- Using WaitForTransfer As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":WaitForTransfer")
- Using mmf = MemoryMappedFile.OpenExisting("MemoryMappedComms:712247:" & Name & ":Data")
- Using mmfv As MemoryMappedViewStream = mmf.CreateViewStream
- Using br As New BinaryReader(mmfv)
- RaiseEvent BytesReceived(br.ReadBytes(mmfv.Length))
- End Using
- End Using
- End Using
- WaitForTransfer.Set()
- End Using
- End Using
- End While
- End Using
- End Using
- Catch ex As Exception
- End Try
- End Using
- End Sub) With {.IsBackground = True}
- CommunicationsThread.Start()
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- Running = False
- End Sub
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement