Cross Thread вызывать из класса? Смущенный - vb.net - PullRequest
0 голосов
/ 24 января 2012

может быть, меня опускают ... но дело в том, что я немного n00b относительно потоков ...

Я использую последовательный порт в классе.Я поднимаю событие из этого класса в мою форму вызова класса.Событие содержит полученные данные ...

Я хочу просто заполнить текстовое поле из возбужденного события.

Теперь я специально не создаю отдельный поток, но при попытке получить обычную ошибку перекрестной цепочкиобновить текстовое поле в пользовательском интерфейсе, поэтому я предполагаю, что последовательный порт и его внутренние методы, вероятно, создают свои собственные потоки ...

Несмотря на это, я немного запутался в том, как правильно реализовать вызов,из моей основной формы, указывая на поток в экземпляре класса ...

Я надеюсь, что это имеет смысл ...

Dim WithEvents tmpRS232 As New clsRS232</p> <pre><code>Private Sub but_txt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles but_txt.Click tmpRS232.Set_com_port("COM8", 38400) tmpRS232.Transmit_data(txt_tx.Text) End Sub Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned txt_rx.Text = str_data 'Cross threading error MsgBox(str_data) 'Fires without errors End Sub

Может кто-нибудь предоставить пример кода на основе этого кода?

спасибо.

Ответы [ 2 ]

5 голосов
/ 24 января 2012

Вы правы, проблема в том, что вы пытаетесь обновить элемент пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом (в данном случае обработчик последовательного порта).Что вам нужно сделать, это проверить, установлен ли флаг InvokeRequired на элемент управления, к которому вы пытаетесь получить доступ из обратного вызова.Если это так, это означает, что вам нужно выполнить маршаллинг вашего вызова в потоке пользовательского интерфейса.Вы можете достичь этого, используя Invoke или BeginInvoke из System.Windows.Forms.Control .

Private Delegate Sub SetRxTextCallback(ByVal [text] As String)

Private Sub SetRxText(ByVal [text] As String)
    txt_rx.Text = [text]
End Sub

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned

    If (txt_rx.InvokeRequired) Then
        Dim d As New SetRxTextCallback(AddressOf Me.SetRxText)
        Me.BeginInvoke(d, New Object() {[str_data]})
    End If

    'txt_rx.Text = str_data 'Cross threading error
    'MsgBox(str_data) 'Fires without errors
End Sub

Вот ссылка на документацию MSDN , которая объясняет этоподробно.

2 голосов
/ 24 января 2012

Или просто ...

Private Sub tmprs232_rx_data_returned(ByVal str_data As String) Handles tmpRS232.rx_data_returned
    If InvokeRequired Then
        Invoke(Sub()txt_rx.Text = str_data)
    Else
        txt_rx.Text = str_data
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...