PROBLEMA COM LISTBOX

 Tópico anterior Próximo tópico Novo tópico

PROBLEMA COM LISTBOX

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#252633 - 21/01/2008 21:17:25

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Última edição em Editado em 21/01/2008 23:33:35 por CARINHENA por

Pessoal, ando tendo um problema...

Uso sockets para receber e enviar mensagens, entre computadores.

nessa função:

Private Sub _socketManager_onDataArrival(ByVal SocketID As String, ByVal SocketData As String) Handles _socketManager.onDataArrival

Histórico.Items.Add SocketID & "<" & SocketData & ">"

    End Sub


Da o seguinte erro:

"Operação entre threads inválida: controle 'Mensagem' acessado de um thread que não é aquele no qual foi criado."

NO google achei algo dizendo sobre a propriedade invoke, mas, só achei com textbox, não sei como funciona, num listbox...

alguem sabe o pq disso e como corrigir?


Carinhena

A melhor forma de aprender e ensinando!


#252680 - 22/01/2008 10:20:13

USUARIO.EXCLUIDOS

Cadast. em:


É, como vc viu no google, com certeza vai ter que usar classes DELEGATE, daí o método invoke...Programação assíncrona é algo bem chato, ainda mais se vc for iniciante. Aqui vc encontra alguma coisa útil sobre Threads.




Resposta escolhida #252691 - 22/01/2008 10:59:12

USUARIO.EXCLUIDOS

Cadast. em:


Última edição em Editado em 22/01/2008 11:01:41 por LEANDRO por

O código está em um form correto? Se sim é bem facil, é só criar outra sub e chamar ela pelo Invoke do form
    'primero tem que declarar uma delegate, se não me engano isso é obrigatório no VB.Net
    Private Delegate Sub DataArrivalDelegate(ByVal SocketID As String, ByVal SocketData As String)

    'o seu evento em vez de fazer diretamente o que fazia vai apenas chamar o Invoke do form
    Private Sub _socketManager_onDataArrival(ByVal SocketID As String, ByVal SocketData As String) Handles _socketManager.onDataArrival
        Me.Invoke(New DataArrivalDelegate(AddressOf invoked_socketManager_onDataArrival), SocketID, SocketData)
    End Sub

    'aqui a gente cria uma nova função exatamente igual a anterior, a diferença é que como ela é chamada pelo
    'Invole ela vai estar rodando no mesmo Thread do Form de forma que o erro não acontece
    Private Sub invoked_socketManager_onDataArrival(ByVal SocketID As String, ByVal SocketData As String)
        Histórico.Items.Add(SocketID & "<" & SocketData & ">")
    End Sub




#252710 - 22/01/2008 12:07:47

CARINHENA
SOROCABA
Cadast. em:Junho/2004


LEANDRO

Valeu pela dica, fiz de outra forma, mas, sua dica ta mais que anotada!! rs

Public Delegate Sub Delegação(ByVal texto As String)

Public Sub DefinirTexto(ByVal texto As String)
        On Error Resume Next
           If histórico.InvokeRequired Then
            Dim d As New Delegação(AddressOf DefinirTexto)
                 histórico.Items.Add(histórico.Invoke(d, Now.ToString(texto)))
         Else
            histórico.Items.Add(Now.ToString(texto))
        End If
    End Sub


    Private Sub _socketManager_onDataArrival(ByVal SocketID As String, ByVal SocketData As String) Handles _socketManager.onDataArrival
        DefinirTexto("[" & SocketID.Substring(0, 3) & "]: " & SocketData)
    End Sub


Assim independente da ação basta colocar o Definirtexto que ele busca o endereço do Thread...

Mas, tem um problema que não to conseguindo resolver:

Quando envio tanto pro server como pro client, algumas palavras, não aparece de forma correta, exemplo:
texto aparece no outro como " exto"
"Santos Futebol Clube" aparece como "1ano1 6uebol clube"

Tem que decodificar alguma coisa?


Carinhena

A melhor forma de aprender e ensinando!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por WEBMASTER em 18/08/2009 10:03:45