gpt4 book ai didi

vb.net - Vb.net-通过关闭表单来实现跨线程异常

转载 作者:行者123 更新时间:2023-12-03 13:16:08 25 4
gpt4 key购买 nike

我正在研究从串行端口(COMM-端口)读取内容的应用程序。
简而言之,它的工作方式是这样的:当您在酒吧或餐厅工作时,必须先扫描某种卡片,然后才能在寄存器中输入内容。如果此卡返回的号码很好,您可以输入一些内容。

因此,必须有一种监听串行端口并检查是否有人扫描卡以及它是否是具有良好权限的卡的表格。

如果此人享有良好的权利,则可以关闭该表格,然后调用另一个表格。

现在,在代码中:

在此,加载了MenuForm(在读取正确的代码后必须可访问的表单)。我调用frmWaiterKey来显示。

Private Sub frmMenu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oForm As frmWaiterKey = New frmWaiterKey()
oForm.ShowDialog()
End Sub

类frmWaiterKey的代码:
Private Sub frmWaiterKey_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
nameArray = SerialPort.GetPortNames
OpenComPort()
AddHandler myComPort.DataReceived, SerialDataReceivedEventHandler1
End Sub

Sub OpenComPort()

Try
' Get the selected COM port's name
' from the combo box.
If Not myComPort.IsOpen Then
myComPort.PortName = _
nameArray(0).ToString()
' Get the selected bit rate from the combo box.
myComPort.BaudRate = CInt(9600)
' Set other port parameters.
myComPort.Parity = Parity.None
myComPort.DataBits = 8
myComPort.StopBits = StopBits.One
myComPort.Handshake = Handshake.None

'myComPort.ReadTimeout = 3000
'myComPort.WriteTimeout = 5000

' Open the port.
myComPort.Open()

End If

Catch ex As InvalidOperationException
MessageBox.Show(ex.Message)
Catch ex As UnauthorizedAccessException
MessageBox.Show(ex.Message)
Catch ex As System.IO.IOException
MessageBox.Show(ex.Message)
End Try

End Sub
Sub CloseComPort()

Using myComPort
If (Not (myComPort Is Nothing)) Then
' The COM port exists.
If myComPort.IsOpen Then
' Wait for the transmit buffer to empty.
Do While (myComPort.BytesToWrite > 0)
Loop
End If
End If
End Using

End Sub

Private SerialDataReceivedEventHandler1 As New SerialDataReceivedEventHandler(AddressOf DataReceived)

' Specify the routine that runs when
' a DataReceived event occurs at myComPort.

' This routine runs when data arrives at myComPort.

Friend Sub DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Dim newReceivedData As String
' Get data from the COM port.
newReceivedData = myComPort.ReadExisting
newReceivedData = newReceivedData.Trim()
MsgBox(newReceivedData)
If newReceivedData.Equals("00150324294764") Then
CloseComPort()
Me.Close()
End If

End Sub

我在最后一行收到错误:Me.Close()
我明白了:我从frmMenu调用了frmWaiterKey表单,在这里无法关闭它...
但是我不知道如何解决这个问题。

我希望有人可以帮助我或告诉我我做错了什么。

最佳答案

首先,您需要制作这样的方法:

Private Sub CloseMe()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf CloseMe))
Exit Sub
End If
Me.Close()
End Sub

然后,通过调用该方法关闭表单,如下所示:
If newReceivedData.Equals("00150324294764") Then
CloseComPort()
CloseMe()
End If

之所以需要这样做,是因为WinForms中的所有UI Activity 都必须从同一线程执行。由于 DataReceived方法是从另一个线程调用的,因此必须先返回UI线程,然后才能关闭表单。如果您位于UI线程以外的任何线程上,则 InvokeRequired属性返回true,并且 Invoke方法从UI线程调用给定方法。

关于vb.net - Vb.net-通过关闭表单来实现跨线程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12840714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com