2015-04-07 6 views
1

просто небольшая проблема с моей программой. Я работал в приложении устройства в VS2005 VB.Net. Эта программа будет работать на моем устройстве, которое будет подключаться к устройству Bluetooth. Это текущий код:Как заставить ShowDialog() не блокировать событие вызывающего абонента

В классе, который обрабатывает событие:

Public Class BluetoothDevice : Implements IRFID 
    'static instance of class 
    Public Shared _btDevice as BluetoothDevice 
    Private WithEvents bluetoothDevice as BRIReader 
    'This is the event handler 
    Private Sub BluetoothDevice_EventHandlerConnectionStateChanged(ByVal sender as Object, ByVal EvtArgs As EVTADV_DeviceConnectionStateEventArgs) handles bluetoothDevice.EventHandlerDeviceConnectState 
     Select Case EvtArgs.DeviceConnectState 
      Case EVTADV_DeviceConnectionStateEventArgs.CONNECTED 
       RaiseEvent OnReaderConnectionEventChanged(connectionState.Connected) 
      Case EVTADV_DeviceConnectionStateEventArgs.OFFLINE 
       RaiseEvent OnReaderConnectionEventChanged(connectionState.Offline) 
      Case EVTADV_DeviceConnectionStateEventArgs.RECONNECTING 
       RaiseEvent OnReaderConnectionEventChanged(connectionState.Reconnecting) 
     End Select 
    End Sub 
End Class 

В форме пользовательского интерфейса, который ловит RaiseEvent. Это также Основная форма:

Private Delegate Sub xOnReaderConnectEventChangeHandler(ByVal connState as connectionState) 
Private Sub OnReaderConnectEventChangeHandler(ByVal connState as connectionState) 
    If Me.InvokeRequired Then 
     Me.Invoke(New xOnReaderConnectEventChangeHandler(AddressOf OnReaderConnectEventChangeHandler), connState) 
    Else 
     Select Case connState 
      Case connectionState.Connected 
       '_form here is a global object containing the form we ShowDialog() 
       If _form IsNot Nothing 
        _form.Dispose() 
        _form = Nothing 
       EndIf 
      Case connectionState.Offline 
       'haven't done anything yet 
      Case connectionState.Reconnecting 
       'show the form 
       _form.ShowDialog() 
     End Select 
    End If 
End Sub 

Теперь вот форма, которая будет пытаться подключить устройство. Это форма, которая подсчитывает время, прошедшее с момента переподключения состояния, и имеет кнопку «Отмена»:

Public Class FormReconnect 
    Private WithEvents _irfid as IRFID 

    Private Sub FormReconnect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     'form load 
     'this method returns the instance of BluetoothDevice Class 
     _irfid = BluetoothDevice.GetInstance() 
    End Sub 

    'I also handle the event here since the caller form is not active 
    'This form SHOULD close when the connection is established 
    Private Delegate Sub xOnReaderConnectionEventChangeHandler(ByVal connState As connectionState) 
    Private Sub OnReaderConnectionEventChangeHandler(ByVal connState As connectionState) Handles _irfid.OnReaderConnectionEventChange 
     If Me.InvokeRequired Then 
      Me.Invoke(New xOnReaderConnectionEventChangeHandler(AddressOf OnReaderConnectionEventChangeHandler), connState) 
     Else 
      Select Case connState 
       Case connState.Connected 
        'I only handle the connected state. If Device is connected, close this form 
        Me.Close() 
      End Select 
     End If 
    End Sub 
End Class 

Ситуация, когда MainForm шоу, то я извлечь аккумулятор из устройства, их состояние соединения станет в автономном режиме, а затем снова подключиться, затем отобразится форма повторного подключения. Проблема заключается в том, что при повторном подключении формы с помощью метода ShowDialog() класс, обрабатывающий событие (BluetoothDevice), не будет запущен, даже если состояние соединения с устройством уже Connected (отображается на устройстве с мигающим светом). Похоже, что ShowDialog() пересоздания формы блокирует класс, потому что, когда я нажимаю кнопку отмены, и повторное соединение формы закрывается, будет вызываться обработчик событий BluetoothDevice. Что будет лучшим обходным решением здесь? Я пробовал Show(), он запускает событие, но он обрабатывается как вызывающим, так и формой повторно подключаться, заставляя форму повторно подключаться, не показывая основную форму.

EDIT 1: То, что я хочу, чтобы это сделать, когда я ShowDialog() и форму Переустановка активен (таким образом, форма Main «скрыта» под переподключением), форма Переустановка будет обрабатывать событие, выращенные в BluetoothDevice Класс.

РЕДАКТИРОВАТЬ 2: Когда активна функция реконфигурации формы. BluetoothDevice не вызывает никаких событий. Думайте, что он блокируется ShowDialog(). Таким образом, Form Reconnect не закрывает даже состояние соединения «Подключено».

+0

@JawadZeb попробовал 'Show()', и когда обработчик события поднял события, как Form Main, так и Form Reconnects обрабатывают его (сначала сначала, затем повторно подключайтесь), удаляя форму, оставляя мое приложение без активной формы (даже основная форма больше не отображается, не знаю почему). – Gatherer

ответ

1

Используйте этот метод.

  1. Главная форма (используйте одноплодной шаблон) обрабатывает все события, связанные с устройством
  2. После отключения или в начале создать нить и поставить форму шоу повторного подключения (снова использовать синглтон шаблон для этой формы тоже) логика там.

    MainForm.getInstance.Invoke (Новый MethodInvoker (Sub() Dim formReconnect как форма = formReconnect.GetInstance() Если formReconnect.visible = False Тогда formReconnect.TopMost = True formReconnect.Show() End If
    End Sub))

  3. При повторном подключении через окно RECONNECT вызвать главную форму и закрыть форму повторного подключения

  4. Если переподключение устройства автоматически есть основная форма вызова близко метод повторного подключения.
+0

мы уже пробовали вызов ShowDialog() через поток. Результат тот же, событие, поднятое, обрабатывается как Form Main, так и Form Reconnect (я хочу, чтобы Form Reconnect обрабатывал его, когда активна функция Reconnect формы), но спасибо за ответ. Кроме того, я не хочу прерывать форму Main, так как она также запускает некоторые фоновые процессы. – Gatherer

+0

Не обрабатывайте никаких событий в форме повторного подключения. Только обрабатывайте их в основной форме. Форма reconnect будет действовать только как элемент пользовательского интерфейса, сообщая им, что приложение ожидает повторного подключения. Я никогда не говорил закрыть основную форму. –

+0

О, я вижу. Но тогда мы используем 'ShowDialog()'. Они не хотят использовать 'show()', так как мы хотим приостановить всю фоновую обработку в основной форме во время повторного подключения. Даже если я обрабатываю их всех в Основной форме, событие не запускается. Как вы думаете, что у меня ошибка в коде? Потому что, в наших других программах с такой же структурой, как это, событие может быть поднято и обработано формами showdialog-ed. – Gatherer

0

Использовано BeginInvoke при поднятии формы Снова подключить. Таким образом, форма повторного соединения может обрабатывать событие. Я просто должен был удалитьHandler в форме Main, чтобы предотвратить его повышение одного и того же события.

+0

кредитов @Dasiths, получил идею от его ответа. – Gatherer

+0

Пожалуйста, отметьте ответ, если вы сочтете это полезным. –