Usuário com melhor resposta
ERRO USANDO DISPARANDO THREAD PARA ARRAY (URGENCIA EXTREMA)

Pergunta
-
Ola, Já procurei em vários sites na net mas não achei nada. Quem puder me ajudar pois tenho urgencia urgentissima
. 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
Email: alex@base1.com.br
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 SnippetPrivate Terminais As Array
Por exemplo, por:
Code SnippetPrivate 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
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.
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
.
Dica 3: Não utilize "PS" em documentos editáveis... Não faz sentido (ops, essa foi para mim)
-
Acrescentando alguns fragmentos:
Imports
SystemImports
System.Collections.GenericImports
System.TextImports
System.Net.SocketsImports
System.NetImports
System.Threading...........
Public
Sub StartServer()Server =
New TcpListener(6550) 'Habilita a porta 6550Server.Start()
'Abre a porta para conexao. While TrueCliente = Server.AcceptSocket()
posicao = foundPos()
Terminais(posicao) =
Terminais(posicao).setSock(Cliente)
Terminais(posicao).setPosicao(posicao)
xcliente =
New Thread(AddressOf Terminais(posicao).StartTerminal) 'Inicia a thread da classexcliente.Start()
End If
End If End While End Sub -
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 SnippetPrivate Terminais As Array
Por exemplo, por:
Code SnippetPrivate 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
-
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
-
-
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
-
Como você abriu outro tópico, respondi lá:
http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3834489&SiteID=21