none
ERRO USANDO DISPARANDO THREAD PARA ARRAY (URGENCIA EXTREMA) RRS feed

  • Pergunta

  • Ola, Já procurei em vários sites na net mas não achei nada. Quem puder me ajudar pois tenho urgencia urgentissima Smile. O problema é o seguinte:

     

    Eu tenho um Array de classes e preciso disparar uma thread para cada classe dentro do array, em C# funciona mas em VB eu não to conseguindo:

     

    C#:

        Thread Minhathread;

        Minhathread= new Thread(MeuArraydeClasses[posicao].StartTerminal);

        Minhathread.Start();

     

    'Funciona Perfeitamente 

     

    VB:

        Dim Minhathread As Thread

        Minhathread = New Thread(AddressOf MeuArraydeClasses(posicao).StartTerminal)

        Minhathread .Start()

     

    'Da erro na parte vermelha

     

    Em VB da erro na segunda linha pois me parece q não ta aceitando os parênteses "(posicao)" do meu array de classes possivelmente. Sendo que em C# aceita perfeitamente. Preciso achar uma solução com urgência.

     

    Lembrando q os namespace estao todos importados, tudo direitinho.

     

    Cada classe dessa é uma conexao de um microterminal ao meu sistema. Se fosse 1 microterminal apenas seria facil de resolver. Mas preciso conectar com vários microterminais, poriso esse código eh essencial e preciso dele funcionando em VB pois todo o sistema é em VB. Se alguem quiser o codigo completo eu mando mas nao acho que seja necessario, pois no resto ta funcionando perfeitamente principalmente qdo eu disparo MeuArraydClasses sem criar uma thread nova usando apenas a thread principal do programa. Mas como eu tenho q criar varios sockets para varias conexoes entao essas threading sao essenciais e eu to morrendo de raiva pq em C# funciona perfeitamente.

     

    Quem puder me dar uma luz!

     

    Abraços

    Alexsandro Nunes

    MSN: death.cool@bol.com.br

    Email: alex@base1.com.br

     

    terça-feira, 2 de setembro de 2008 16:18

Respostas

  • Alexsandro,

     

    O problema está na criação do array de terminais... Você está criando um array de elementos da classe "object", e não da classe "Terminal.

     

    Substitua a declaração:

     

    Code Snippet

     

    Private Terminais As Array

     

     

     

    Por exemplo, por:

     

    Code Snippet

     

    Private Terminais(10) As Terminal

     

     

     

    Lembrando que você tem que lembrar de redimensionar o Array quando/se necessário.

     

    Aliás, se precisar adicionar elementos dinamicamente, considere utilizar um List<Terminal> ao invés de array.

     

    Abraços,

    Caio Proiete

    terça-feira, 2 de setembro de 2008 17:02
    Moderador

Todas as Respostas

  • Alexsandro

     

    Não há nada de errado no trecho de código que você enviou. Você está instanciando cada elemento do array corretamente?

     

    Qual é o erro que acontece, exatamente?

     

    Abraços,

    Caio Proiete

     

    PS: 

    Dica 1: O que você tem ai é um array de OBJETOS! Não de classes. Smile

     

    Dica 2: Evite colocar "urgente", "duvido", "desafio", etc... Muita gente não gosta e deixa de responder por causa disso. Não é por você colocar "urgente" que fará com que as pessoas respondam mais rápido Wink.

     

    Dica 3: Não utilize "PS" em documentos editáveis... Não faz sentido (ops, essa foi para mim) Smile

     

    terça-feira, 2 de setembro de 2008 16:39
    Moderador
  •  

    Acrescentando alguns fragmentos:

     

    Imports System

    Imports System.Collections.Generic

    Imports System.Text

    Imports System.Net.Sockets

    Imports System.Net

    Imports System.Threading

     

    Private Terminais As Array

    Private Server As TcpListener

    Private Cliente As Socket

    ...........

    Public Sub StartServer()

    Dim posicao As Integer

    Dim xcliente As Thread

    Server = New TcpListener(6550)

    'Habilita a porta 6550

    Server.Start()

    'Abre a porta para conexao.

    While True

    Cliente = Server.AcceptSocket()

    'Aceita conexao

    If Cliente.Connected Then

    posicao = foundPos()

    If posicao <> -1 Then

    Terminais(posicao) = New Terminal() ' Joga a classe Terminal() no array

    Terminais(posicao).setSock(Cliente)

    Terminais(posicao).setPosicao(posicao)

    xcliente = New Thread(AddressOf Terminais(posicao).StartTerminal)

    'Inicia a thread da classe

    xcliente.Start()

    End If

    End If

    End While

    End Sub

     

     

    terça-feira, 2 de setembro de 2008 16:51
  • Alexsandro,

     

    O problema está na criação do array de terminais... Você está criando um array de elementos da classe "object", e não da classe "Terminal.

     

    Substitua a declaração:

     

    Code Snippet

     

    Private Terminais As Array

     

     

     

    Por exemplo, por:

     

    Code Snippet

     

    Private Terminais(10) As Terminal

     

     

     

    Lembrando que você tem que lembrar de redimensionar o Array quando/se necessário.

     

    Aliás, se precisar adicionar elementos dinamicamente, considere utilizar um List<Terminal> ao invés de array.

     

    Abraços,

    Caio Proiete

    terça-feira, 2 de setembro de 2008 17:02
    Moderador
  • Nohhhhhh funcionou certinho!!!!!

     

    O vacilo ali foi pq eu tive q converter todo o codigo de C# em VB entao acaba passando detalhes.

     

    Ow.. valeu mesmo!!!!

    Ajudou dimais pq eu preciso colocar esses microterminais o mais rapido possivel.

     

    Um abraçao irmao

     

    terça-feira, 2 de setembro de 2008 17:13
  • Maravilha.

     

    Por favor, marque esse tópico como respondido.

     

    Abraços,
    Caio Proiete

     

    terça-feira, 2 de setembro de 2008 18:10
    Moderador
  •  

    So mais uma coisinha, é o seguinte:

     

    Tenho uma thread principal que eh o form inicial do programa, neste form tem um listbox e um botao.

    Este botao chama uma thread q direciona para uma classe(a do codigo acima do post) q vamos chamar de thread1 e dentro dessa classe é criado uma outra thread q tbem direciona para outra classe(a classe Terminal) q vamos chamar de thread2.

     

    entao dentro da classe da thread2 eu preciso adicionar um item ao listbox da thread principal, e a mesma coisa eu preciso fazer na thread1.

     

    simplesmente se eu faço algo como:

    frmMain.Listbox.itens.add("teste")

     

    dentro de qquer thread secundaria nada acontece.

     

    se eu instancio o formulario principal e depois chamo ele atraves do Sub Main e dentro das thread1 e 2 eu tento adicionar um item ao listbox me da uma msg de erro de que eu nao posso adicionar item q esta em outra thread.

     

    Eu ja li varias paginas na net falando sobre multthreading e etc mas nao achei um exemplo pratico ou algo q realmente me exclareça como funciona o acesso a outra thread, e inclusive a thread principal do programa.

     

    Se alguem puder me exclarecer eu ficaria agradecido.

     

    Abraços

    Alexsandro Nunes

    quinta-feira, 4 de setembro de 2008 14:44
  • quinta-feira, 4 de setembro de 2008 16:05
    Moderador