none
Formulário Travando com 2 Threads leitura de porta serial RRS feed

  • Pergunta

  • Bom dia,
    Criei um código em VB.NET que faz a leitura de uma porta serial de uma balança, utilizei 2 Threads para enviar tudo para um Richtextbox.

    O código funciona perfeitamente, recebe os dados da porta serial, manipula certinho, o problema é que ele fica "travando"... Consigo ver que está travando no momento em que vou arrastar o formulário ou quando posiciono o cursor em cima dos botões, pois percebo que existe um delay no Hover.

    O código é o seguinte:

    Public Class Form1
    
        Private trd As Thread
        Private trd2 As Thread
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            trd = New Thread(AddressOf ThreadTask)
            trd.IsBackground = True
            trd.Start()
            trd2 = New Thread(AddressOf ThreadTask2)
            trd2.IsBackground = True
            trd2.Start()
    
     End Sub
    
        Private Sub ThreadTask2(ByVal [text] As String) 'input from ReadExisting
            Try
                If Me.RichTextBox1.InvokeRequired Then
                    Dim x As New SetTextCallback(AddressOf ThreadTask2)
                    Me.Invoke(x, New Object() {(text)})
    
                Else
                    _SerialPort1.NewLine = Chr(13)                    '                
    
                    Me.RichTextBox1.Text = _SerialPort1.ReadLine()
    
                End If
            Catch ex As Exception
    
            End Try      
    
        End Sub
    
        Private Sub ThreadTask() Handles SerialPort1.DataReceived
            Try
    
                ThreadTask2(SerialPort1.ReadExisting())
    
            Catch ex As Exception
    
            End Try
    
        End Sub

    Alguém saberia, por gentileza me dar uma luz para que eu possa identificar qual o erro que estou cometendo?

    Desde já agradeço muito.

    Att.


    • Editado Rodrigo.ki sábado, 16 de junho de 2018 12:49 simplifiquei o código
    sábado, 16 de junho de 2018 12:37

Respostas

  • Bom dia.

    Para trabalhar com a porta serial, eu utlilizo DELEGATE no lugar de threads.

    Segue um exemplo.

    No meu caso, a leitura era registrada na lbl_Display.

    Public Delegate Sub myDelegate()
    
    Private Sub Serial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Serial.DataReceived
            lbl_Display.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})
    End Sub
    
    
    Public Sub updateTextBox()
    
      
                        Timer_Display.Interval = 200
                        Timer_Display.Enabled = True
    
                        While Timer_Display.Enabled = True
                            Application.DoEvents()
                            X += Serial.ReadExisting
                        End While
    
                        P = InStr(X, ";") 'SEGUNDA TRILHA COMEÇA NO ;
                        P2 = InStr(X.Substring(P - 1), "?") 'SEGUNDA TRILHA TERMINA NO ?
                        X = X.Substring(P, P2 - 2)
    
                        lbl_Display.Text = X
    
    End Sub

    MARIANO1776


    sábado, 16 de junho de 2018 13:39

Todas as Respostas

  • Bom dia.

    Para trabalhar com a porta serial, eu utlilizo DELEGATE no lugar de threads.

    Segue um exemplo.

    No meu caso, a leitura era registrada na lbl_Display.

    Public Delegate Sub myDelegate()
    
    Private Sub Serial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Serial.DataReceived
            lbl_Display.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})
    End Sub
    
    
    Public Sub updateTextBox()
    
      
                        Timer_Display.Interval = 200
                        Timer_Display.Enabled = True
    
                        While Timer_Display.Enabled = True
                            Application.DoEvents()
                            X += Serial.ReadExisting
                        End While
    
                        P = InStr(X, ";") 'SEGUNDA TRILHA COMEÇA NO ;
                        P2 = InStr(X.Substring(P - 1), "?") 'SEGUNDA TRILHA TERMINA NO ?
                        X = X.Substring(P, P2 - 2)
    
                        lbl_Display.Text = X
    
    End Sub

    MARIANO1776


    sábado, 16 de junho de 2018 13:39
  • Muito obrigado, MARIANO1776!! 

    Fiz conforme você me indicou, utilizei DELEGATE e o resultado ficou do jeito que eu queria.

    Att,

    terça-feira, 19 de junho de 2018 11:51
  • De nada.

    Se te ajudou, marque como resposta/útil.


    MARIANO1776

    terça-feira, 19 de junho de 2018 15:10