Выбрать главу

 '1. Вызвать функцию в синхронном режиме

 'и блокировать поток выполнения до тех пор,

 'пока файл не будет передан

 '1a. Информировать пользователя о том, что мы пытаемся передать данные

 Me.Text = "Trying to send..."

 'Подождать, пока клиент не будет найден, а затем передать файл

 irdaFileSender.LoopAndAttemptIRSend()

 '1c. Информировать пользователя о том, что файл передан

 MsgBox("File sent!")

 Me.Text = "IrDA: Sent!"

 '2. Вызвать функцию в асинхронном режиме и поручить

 'передачу файла фоновому потоку

 'irdaFileSend.LoopAndAttemptIRSendAsync()

 'ПРИМЕЧАНИЕ: Если мы вызываем функцию в асинхронном режиме, то должны

 'периодически проверять, не завершила ли она выполнение, путем

 'вызова метода 'irdaFileSend.Status'

End Sub

Private Sub buttonTestFileReceive_Click(ByVal sender As Object, _

 ByVal e As EventArgs) Handles buttonTestFileReceive.Click

 'Если файл назначения уже существует, уничтожить его

 Const fileName As String = "\myTestReceiveFile.txt"

 If (System.IO.File.Exists(fileName)) Then

  System.IO.File.Delete(fileName)

 End If

 Dim irdaFileReceiver As IrDAFileReceive

 irdaFileReceiver = New IrDAFileReceive(fileName, _

  myIrDASocketName)

 'Имеется 2 режима: 1 — Sync (синхронный), 2 - Async (асинхронный)

 '1. Вызвать функцию в синхронном режиме

 ' блокировать поток выполнения до тех пор, пока

 'файл не будет получен

 '1a. Информировать пользователя о том, что мы ожидаем получения файла

 Me.Text = "Waiting to receive..."

 '1b. Ожидать, пока не будет сделана попытка установления с нами связи

 'и передачи файла

 irdaFileReceiver.WaitForIRFileDownload()

 '1с. Информировать пользователя о том, что мы получили переданный файл

 Me.Text = "IrDA: received!"

 MsgBox("File received!")

 '2. Вызвать функцию в асинхронном режиме и поручить

 'получение файла фоновому потоку

 'irdaFileReceive.WaitForIRFileDownloadAsync()

 'ПРИМЕЧАНИЕ: Если мы вызываем функцию в асинхронном режиме, то должны

 'периодически проверять, не завершила ли она выполнение, путем

 'вызова метода 'irdaFileReceive.Status'

End Sub

Листинг 15.4. Класс IrDAFileSend

Option Strict On

'====================================================================

'Этот класс является клиентом IrDA. Он осуществляет поиск сервера

'IrDA, имя которого совпадает с именем службы IrDA, и после того, как

'он найден, направляет ему поток данных файла,

'====================================================================

Class IrDAFileSend

Private m_descriptionOfLastSendAttempt As String

Private m_IrDAServiceName As String

Private m_fileToSend As String

Private m_wasSenderStopped As Boolean

Public Enum SendStatus

 AttemptingToSend

 Finished_Successfully

 Finished_Aborted

 Finished_Error

End Enum

Private m_SendStatus As SendStatus

Public ReadOnly Property Status() As SendStatus

 Get

  'Блокировка выполнения параллельных операций чтения/записи в m_SendStatus

  SyncLock (Me)

   Return m_SendStatus

  End SyncLock

 End Get

End Property

Private Sub setStatus(ByVal newStatus As SendStatus)

 'Блокировка выполнения параллельных операций чтения/записи в m SendStatus

 SyncLock (Me)

  m_SendStatus = newStatus

 End SyncLock

End Sub

Public ReadOnly Property ErrorText() As String

 Get

  Return m_descriptionOfLastSendAttempt

 End Get

End Property

'-----------

'КОНСТРУКТОР

'-----------

Public Sub New(ByVal fileToSend As String, ByVal irdaServiceName As String)

 'Имя сокета IrDA, поиск которого мы хотим осуществить

 m_IrDAServiceName = irdaServiceName

 'Файл, который мы хотим передать

 m_fileToSend = fileToSend

End Sub

'--------------------------------------------------------------

'Запускает новый поток для осуществления попытки отправки файла

'--------------------------------------------------------------

Public Sub LoopAndAttemptIRSendAsync()

 'Мы находимся в режиме передачи

 setStatus(SendStatus.AttemptingToSend)

 'Пользователь пока что не отменил выполнение операции

 m_wasSenderStopped = False

 'Это функция, которую должен запустить на выполнение новый поток

 Dim threadEntryPoint As System.Threading.ThreadStart

 threadEntryPoint = _

  New System.Threading.ThreadStart(AddressOf LoopAndAttemptIRSend)

 '-----------------------------------

 'Создать новый поток и запустить его

 '-----------------------------------

 Dim newThread As System.Threading.Thread = _

  New System.Threading.Thread(threadEntryPoint)

 newThread.Start()

 'Вперед!

End Sub

'-----------------------------------------------------

'Входит в цикл и пытается передать файл посредством IR

'-----------------------------------------------------

Public Sub LoopAndAttemptIRSend()

 Dim irDASender As System.Net.Sockets.IrDAClient

 Dim streamOutToIrDA As System.IO.Stream

 Dim streamInFromFile As System.IO.Stream

 'Пользователь пока что не отменил выполнение операции

 m_wasSenderStopped = False

 setStatus(SendStatus.AttemptingToSend)

 '-----------------------------------------------------------------