2013-04-12 41 views
2

我有一個從USB徽章閱讀器獲取用戶ID的功能,用於登錄應用程序。 當我運行應用程序時,直到我滑過標記時,纔會出現登錄窗口。 我需要知道是否可以加載窗口,然後開始運行從USB獲取數據的功能。如何在VB中加載窗體窗口後運行一個函數/子?

謝謝:)

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 
+0

是否要在表單上阻止用戶輸入,直到它被滑動,或者您希望表單接受輸入?想必你正在調用阻塞(同步)方法來讀取徽章。徽章閱讀器的API是否提供任何等效的異步方法? –

回答

6

的問題是,您所呼叫的ReadLine方法,這是一種阻塞(同步)方法。換句話說,當你調用它時,該方法不會返回值直到它有值返回。因此,它會在當前線程上停止執行,直到讀完一行(當徽章被刷新時)。由於您在調用它時已在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 
+1

謝謝你!它的工作.. – user2234234

+0

我有另一個問題,我怎麼能「重新啓動」它?如果我登錄並註銷,那麼我不能再次使用徽章閱讀器! – user2234234

+0

你是說重新啓動應用程序的工作,但在同一個進程中兩次顯示登錄表單不? –

0

嘗試Form Activated事件

Private Sub Form1_Activated(ByVal sender As Object, _ 
    ByVal e As System.EventArgs) Handles MyBase.Activated 
'Call your function here 
End Sub 

它調用的函數After the Form Loads ...

+0

但是,這仍然會鎖定用戶界面,直到徽章被刷卡。 –

+0

仍然無法使用。它會一直等到readUsbPort超時,然後它會顯示窗體窗口。 – user2234234

+0

@ user2234234:你能分享一些你試過的代碼嗎? – Pandian

0
Private Sub loadCombo() 
    Dim sqlconn As New OleDb.OleDbConnection 
    Dim connString As String 
    connString = "" 
    Dim access As String 
    access = "select slno from atable" 
    Dim DataTab As New DataTable 
    Dim DataAdap As New OleDbDataAdapter(access, connString) 
    DataAdap.Fill(DataTab) 
    ComboBox1.DataSource = DataTab 
    ComboBox1.DisplayMember = "slno" 

End Sub 
+0

如何編寫onload()函數的代碼,對於新手來說可能非常有用。 – user4368893

1

在VS2013的工作,我遇到了同樣的問題來了,我需要到一個DataGridView刷新(在gridrows顏色)。這對我有效。

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

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

End Sub 
相關問題