HELP com threads no VB2008

pee2002

Power Member
Estou com um grave problema no meu código da faculdade e gostaria que alguém me ajudasse :(

É assim: Eu tenho que desenvolver uma aplicação que comunica com um automato atraves do protocolo hostlink da OMRON. Até aqui tudo bem, o programa esta a comunicar e por ai fora. Mas acontece que umas das funcionalidades é de supervisão e para isso eu preciso de estar por exemplo de 3 em 3 segundos a comunicar com o automato. Isso implica o uso do Sleep(250) e como já estão a ver o meu programa de 3 em 3 segundos tem um "freeze" de 250ms. O que é aborrecido.

A ideia seria converter a minha função:

Código:
Public Function ComunicaAutomato(ByVal trama As String) As String

        Dim tramaDEresposta As String = ""
        Try
            Form.SerialPort.Open()
            Form.SerialPort.Write(trama)
            [SIZE="4"][B]System.Threading.Thread.Sleep(250)[/B][/SIZE]
            tramaDEresposta = Form.SerialPort.ReadExisting
        Catch ex As Exception
            FormSupervisao.TimerRefresh.Stop()
            MessageBox.Show(ex.Message & vbCrLf & "Comunicações Paradas!", "Erro de Comunicação", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Form.SerialPort.Close()

        Return tramaDEresposta
End Function

Numa thread à parte para que o "freeze" não ocorra.

Alguem sabe como o fazer?

Obrigado
 
ThreadStart job = new ThreadStart(ThreadJob);
Thread thread = new Thread(job);
thread.Start();
Em C# isto cria uma nova thread que corre a routina "ThreadJob". A questão é que deves querer por as duas threads a comunicar e aí já é mais complicado. Não sou propriamente perito nisso.
 
Última edição:
Penso que já resolvi o problema com este exemplo que criei.

Espero que ajude os próximos a ter esta dúvida.

Classe "FillClass"

Código:
Public Class FillClass
    Private intValue As Integer
    Private intReturn(99) As Integer
    Private intMultiplier As Integer

    Public Event Done(ByVal intReturn() As Integer)
    Public WriteOnly Property Value()
        Set(ByVal Value)
            intValue = Value
        End Set
    End Property
    Public WriteOnly Property Multiplier()
        Set(ByVal value)
            intMultiplier = value
        End Set
    End Property
    Public Sub Fill()
        Dim i As Integer
        Dim current As Integer

        current = intValue
        For i = 0 To 10
            intReturn(i) = current
            current *= intMultiplier
        Next
        RaiseEvent Done(intReturn)
    End Sub
    Sub SquareEventHandler(ByVal Square() As Integer) Handles Me.Done
        MessageBox.Show("The square is " & Square.ToString)
    End Sub
End Class

Form1:

Código:
Imports System.Threading

Public Class Form1
    Dim WithEvents oSquare As FillClass

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oThread As System.Threading.Thread
        Dim oFill As New FillClass

        oThread = New Thread(AddressOf oFill.Fill)

        oFill.Value = 3
        oFill.Multiplier = 2
        oThread.Start()
    End Sub

End Class
 
Back
Topo