Advertisement
TizzyT

MemoryMappedComms -TizzyT

Jul 24th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 5.90 KB | None | 0 0
  1. Imports System.IO
  2. Imports System.IO.MemoryMappedFiles
  3. Imports System.Threading
  4.  
  5. Public Class Sender
  6.     Implements IDisposable
  7.  
  8.     Private ReadOnly Name As String
  9.  
  10.     Public Function Send(ByVal Bytes() As Byte) As Boolean
  11.         Return Send(Bytes, Name)
  12.     End Function
  13.  
  14.     Public Shared Function Send(ByVal Bytes() As Byte, ByVal Name As String, Optional ByVal TimeOut As Integer = 0) As Boolean
  15.         Using SingleOut As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":SendSingleOutMutex")
  16.             Try
  17.                 If SingleOut.WaitOne(TimeOut) AndAlso CheckForReader(Name) Then
  18.                     Using mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("MemoryMappedComms:712247:" & Name & ":Data", Bytes.Length)
  19.                         Using mmfv As MemoryMappedViewStream = mmf.CreateViewStream
  20.                             Using bw As New BinaryWriter(mmfv)
  21.                                 bw.Write(Bytes)
  22.                             End Using
  23.                         End Using
  24.                         Using Signal As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":Signal")
  25.                             Using WaitForTransfer As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":WaitForTransfer")
  26.                                 Using StatMutex As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":StatusMutex")
  27.                                     Signal.Set()
  28.                                     WaitHandle.WaitAny({WaitForTransfer, StatMutex}) 'Only waits if the Reader is present
  29.                                 End Using
  30.                             End Using
  31.                         End Using
  32.                     End Using
  33.                     Return True
  34.                 End If
  35.             Catch ex As Exception
  36.             End Try
  37.         End Using
  38.         Return False
  39.     End Function
  40.  
  41.     Private Shared Function CheckForReader(ByVal Name As String) As Boolean
  42.         Try
  43.             Using mmfc As MemoryMappedFile = MemoryMappedFile.OpenExisting("MemoryMappedComms:712247:" & Name & ":Presence")
  44.                 Return True
  45.             End Using
  46.         Catch ex As Exception
  47.             Return False
  48.         End Try
  49.     End Function
  50.  
  51.     Public Sub New(ByVal Name As String)
  52.         Me.Name = Name
  53.     End Sub
  54.  
  55.     Public Sub Dispose() Implements IDisposable.Dispose : End Sub 'Only have this implemented to that when writing code we can use the "using" keyword
  56. End Class
  57.  
  58. Public Class Receiver
  59.     Implements IDisposable
  60.  
  61.     Public Event BytesReceived(ByVal Bytes() As Byte)
  62.  
  63.     Private Name As String
  64.     Private Running As Boolean = True
  65.     Private CommunicationsThread As Thread
  66.  
  67.     Public Sub New(ByVal Name As String)
  68.         Me.Name = Name
  69.         CommunicationsThread = New Thread(Sub()
  70.                                               Using SingleOut As New Mutex(False, "MemoryMappedComms:712247:" & Name & ":RecvSingleOutMutex")
  71.                                                   Try
  72.                                                       SingleOut.WaitOne() 'Waits for the token (this allows only one reader at any given time with the same name)
  73.                                                   Catch ex As Exception
  74.                                                   End Try
  75.                                                   Try
  76.                                                       Using Presence As MemoryMappedFile = MemoryMappedFile.CreateNew("MemoryMappedComms:712247:" & Name & ":Presence", 1)
  77.                                                           Using StatMutex As New Mutex(True, "MemoryMappedComms:712247:" & Name & ":StatusMutex")
  78.                                                               While Running
  79.                                                                   Using Signal As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Me.Name & ":Signal")
  80.                                                                       Signal.WaitOne()
  81.                                                                       Using WaitForTransfer As New EventWaitHandle(False, EventResetMode.AutoReset, "MemoryMappedComms:712247:" & Name & ":WaitForTransfer")
  82.                                                                           Using mmf = MemoryMappedFile.OpenExisting("MemoryMappedComms:712247:" & Name & ":Data")
  83.                                                                               Using mmfv As MemoryMappedViewStream = mmf.CreateViewStream
  84.                                                                                   Using br As New BinaryReader(mmfv)
  85.                                                                                       RaiseEvent BytesReceived(br.ReadBytes(mmfv.Length))
  86.                                                                                   End Using
  87.                                                                               End Using
  88.                                                                           End Using
  89.                                                                           WaitForTransfer.Set()
  90.                                                                       End Using
  91.                                                                   End Using
  92.                                                               End While
  93.                                                           End Using
  94.                                                       End Using
  95.                                                   Catch ex As Exception
  96.                                                   End Try
  97.                                               End Using
  98.                                           End Sub) With {.IsBackground = True}
  99.         CommunicationsThread.Start()
  100.     End Sub
  101.  
  102.     Public Sub Dispose() Implements IDisposable.Dispose
  103.         Running = False
  104.     End Sub
  105. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement