Inquiridor
Erro ao acessar COM

Pergunta
-
Boa tarde
Pessoal estou com um problema para acessar um hardware via ip por portas COM, pela mensagem de erro sei que o problema inicial é de muito tempo tentando acessar, gostaria que vocês me ajudem a entender ela melhor, segue abaixo
The CLR has been unable to transition from COM context 0x2a7a78 to COM context 0x2a7be8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.
Todas as Respostas
-
posta ai o código que tu utiliza pra acessar as portas cara... talvez agente tenha até alguma solução pra isso... mas como tu disse realmente erro de tempo tentando acessar, pelo que entendi a solução seria jogar numa thread este acesso e nesta thread utilizar o tal do CoWaitForMultipleHandles para que o sistema esperasse até a thread terminar a tarefa... lembro de algo assim utilizando pool de thread mas é muito vago... posta o código ai pra nós vermos
-
Cada acesso é feito ao clicar em um botão, logo ele não fica 100% ativo, o usuário clica no botão o sistema conecta o aparelho via ip, executa a função, desconecta do aparelho deixando ele livre novamente, entre a opção de conectar e conectar existe uma sleep de 2 segundos, após clicar no botão todos os outros recursos desde conectar até concluir a tarefa e desconectar é automático
Segue abaixo o código, ele é acionado ao clicar em um botão que chama a sub "usa"
Imports System.Threading
Imports Microsoft.VisualBasic
Imports System.IO
Imports System.Configuration
Imports System.Net.NetworkInformation
Imports System.Text
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.Linq
Imports System.Net
Imports System.Net.SocketsPrivate server As Socket Private porta As Integer = 5000 Private IP As String = "192.168.1.224" Public Sub conecta() ipep = New IPEndPoint(IPAddress.Parse(IP), porta) server = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) conStatus.Text = "Conectando..." conStatus.Text = IP Try server.Connect(ipep) conStatus.Text = "Conectado" Catch err As SocketException conStatus.Text = "Falha" conStatus.Text = (err.ToString()) Return End Try data = New Byte(1023) {} receivedDataLength = server.Receive(data) stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength) lblResposta.Text = stringData End Sub Public Sub usa() conectaNovaComm() liga("1") System.Threading.Thread.Sleep("2000") desliga("1") desconecta() End Sub Public Sub liga(ByVal porta As String) comando = New Byte(1023) {} comando = Encoding.ASCII.GetBytes("set " + porta.ToString & vbCr & vbLf) server.Send(comando) RespModulo() saidas() RespModulo() End Sub Public Sub desliga(ByVal porta As String) comando2 = New Byte(1023) {} comando2 = Encoding.ASCII.GetBytes("reset " + porta.ToString & vbCr & vbLf) server.Send(comando2) RespModulo() saidas() RespModulo() End Sub Public Sub RespModulo() server.Send(comando) data = New Byte(1023) {} receivedDataLength = server.Receive(data) stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength) lblResposta.Text = "" lblResposta.Text = stringData End Sub Public Sub saidas() comando = New Byte(1023) {} comando = Encoding.ASCII.GetBytes("outputs" & vbCr & vbLf) RespModulo() End Sub Public Sub desconecta() conStatus.Text = "Desconectando do Servidor..." server.Shutdown(SocketShutdown.Both) server.Close() conStatus.Text = "Desconectado" End Sub
- Editado Alexandre CCarmo terça-feira, 2 de outubro de 2012 20:41