3

アプリケーションへのログインに使用される USB バッジ リーダーからユーザー ID を取得する機能があります。アプリを実行すると、タグをスワイプするまでログイン ウィンドウが表示されません。Windows をロードできるかどうかを確認してから、USB からデータを取得する関数の実行を開始する必要があります。

ありがとう :)

Private Sub SerialPort1_DataReceived()
    'Threading.Thread.SpinWait(1000)
    OpenPort()
    If SerialPort1.IsOpen() Then

        byteEnd = SerialPort1.NewLine.ToCharArray
        'read entire string until .Newline 
        readBuffer = SerialPort1.ReadLine()
        readBuffer = readBuffer.Remove(0, 1)
        readBuffer = readBuffer.Remove(8, 1)
        WWIDTextBox.AppendText(readBuffer)

    End If
End Sub

Private Sub Form1_Activated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Activated
    SerialPort1_DataReceived()
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'SerialPort1_DataReceived()
End Sub
4

4 に答える 4

6

ReadLine問題は、ブロッキング (同期) メソッドであるメソッドを呼び出していることです。つまり、メソッドを呼び出すと、返す値が得られるまでメソッドは値を返しません。そのため、(バッジがスワイプされると) 完全な行が読み取られるまで、現在のスレッドでの実行が停止されます。呼び出し時に UI スレッド上にいるため、バッジがスワイプされるまで UI がロックされます。

UI スレッドからメソッドを呼び出す代わりにSerialPort1_DataReceived、別のスレッドから作業を行うことができます。これを行う最も簡単な方法はBackgroundWorker、デザイナーでコンポーネントをフォームにドラッグすることです。次に、次のようなコードを追加できます。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    OpenPort()
    If SerialPort1.IsOpen() Then
        byteEnd = SerialPort1.NewLine.ToCharArray
        Dim readBuffer As String = SerialPort1.ReadLine()
        readBuffer = readBuffer.Remove(0, 1)
        readBuffer = readBuffer.Remove(8, 1)
        e.Result = readBuffer
    End If
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    WWIDTextBox.AppendText(CStr(e.Result))
End Sub
于 2013-04-12T15:41:17.427 に答える
1

VS2013で作業していると、同じ問題に遭遇しました。データグリッドビューを更新する必要がありました(グリッド行の色)。これは私にとってはうまくいきました。

Sub MyForm_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged

            If Me.Visible Then
                'do action...
            End If

End Sub
于 2016-01-04T22:34:22.360 に答える