none
Try-Catch em uma Thread RRS feed

  • Pergunta

  • Sempre que uso o Try Catch em uma Thread ela executa a ação do erro, mesmo estando certo.

    O código abaixo, mesmo selecionado o texto na Listbox, aparece a Msgbox e para o código..

       Private t1 As Thread

    Sub instalar()
            Dim delete As String
            Try
                delete = ListBox1.SelectedItems(0)
            Catch
                MsgBox("Perfil não selecionado", MsgBoxStyle.Exclamation)
                Return
            End Try

    No botão uso..:

      t1 = New Thread(AddressOf instalar)
            t1.Start()

    Já tentei com backgroundWorker, mas dá na mesma.

    sexta-feira, 19 de setembro de 2014 15:23

Respostas

  • Desculpe por não dar mais informações..

    É essa:

    Operação entre threads inválida: controle ListBox1 acessado de uma thread que não é aquele no qual foi criado.

    Como resolvo?

    Ah, tá explicado..

    Veja um conceito básico de Multithreading:

    Todo aplicativo possui uma Thread principal, na qual são criadas as janelas e os controles destas janelas.

    Os controles criados na Thread Principal não podem ser acessados de uma outra Thread, que é o que você está fazendo aí:

    delete = ListBox1.SelectedItems(0)

    Veja esse artigo para mais detalhes sobre como solucionar o problema:

    Trabalhando com Threads em formulários Windows


    Herbert Lausmann

    • Marcado como Resposta Yaagoo sexta-feira, 19 de setembro de 2014 22:34
    sexta-feira, 19 de setembro de 2014 21:10

Todas as Respostas

  • Olá Yaagoo,

     mas esse erro não necessariamente é da condição, pode ser erro de Thread non safe !! Ou erro de conversão de não existir o item 0 em seu listbox, capture a exception e veja qual o erro realmente.

    sexta-feira, 19 de setembro de 2014 16:48
  • Como faço isso? :S
    sexta-feira, 19 de setembro de 2014 18:29
  • Olá,

    Que tipo de exceção você está recebendo?


    Herbert Lausmann

    sexta-feira, 19 de setembro de 2014 19:34
  • Desculpe por não dar mais informações..

    É essa:

    Operação entre threads inválida: controle ListBox1 acessado de uma thread que não é aquele no qual foi criado.

    Como resolvo?

    • Sugerido como Resposta Herbert Lausmann sexta-feira, 19 de setembro de 2014 21:05
    • Não Sugerido como Resposta Herbert Lausmann sexta-feira, 19 de setembro de 2014 21:05
    sexta-feira, 19 de setembro de 2014 20:35
  • Desculpe por não dar mais informações..

    É essa:

    Operação entre threads inválida: controle ListBox1 acessado de uma thread que não é aquele no qual foi criado.

    Como resolvo?

    Ah, tá explicado..

    Veja um conceito básico de Multithreading:

    Todo aplicativo possui uma Thread principal, na qual são criadas as janelas e os controles destas janelas.

    Os controles criados na Thread Principal não podem ser acessados de uma outra Thread, que é o que você está fazendo aí:

    delete = ListBox1.SelectedItems(0)

    Veja esse artigo para mais detalhes sobre como solucionar o problema:

    Trabalhando com Threads em formulários Windows


    Herbert Lausmann

    • Marcado como Resposta Yaagoo sexta-feira, 19 de setembro de 2014 22:34
    sexta-feira, 19 de setembro de 2014 21:10
  • Desculpe por não dar mais informações..

    É essa:

    Operação entre threads inválida: controle ListBox1 acessado de uma thread que não é aquele no qual foi criado.

    Como resolvo?

    Ah, tá explicado..

    Veja um conceito básico de Multithreading:

    Todo aplicativo possui uma Thread principal, na qual são criadas as janelas e os controles destas janelas.

    Os controles criados na Thread Principal não podem ser acessados de uma outra Thread, que é o que você está fazendo aí:

    delete = ListBox1.SelectedItems(0)

    Veja esse artigo para mais detalhes sobre como solucionar o problema:

    Trabalhando com Threads em formulários Windows


    Herbert Lausmann

    Valeu cara, mas, não consegui fazer..

    Tentei assim:

        Sub instalar()
            If ListBox1.InvokeRequired Then
                ListBox1.Invoke(instalar, porém não sei o que colocar aqui)
            Else
                Dim delete As String
                delete = ListBox1.SelectedItems(0)
            End If

    End sub

    Dá uma maãozinha :S

    sexta-feira, 19 de setembro de 2014 22:03
  •     Sub instalar()
            If ListBox1.InvokeRequired Then
                ListBox1.Invoke(New Action(AdressOf instalar))
            Else
                Dim delete As String
                delete = ListBox1.SelectedItems(0)
            End If
    End sub


    Herbert Lausmann

    sexta-feira, 19 de setembro de 2014 22:07
  • Valeu cara, mais deu erro no AdressOf instalar

    http://i.imgur.com/wkfeKwV.png
    sexta-feira, 19 de setembro de 2014 22:27
  • Valeu cara, mais deu erro no AdressOf instalar

    http://i.imgur.com/wkfeKwV.png

    Eita, faltou um d, desculpe:

        Sub instalar()
            If ListBox1.InvokeRequired Then
                ListBox1.Invoke(New Action(AddressOf instalar))
            Else
                Dim delete As String
                delete = ListBox1.SelectedItems(0)
            End If
    End sub


    Herbert Lausmann

    sexta-feira, 19 de setembro de 2014 22:32
  • Nem percebi kk..

    Valeu mano. Muito obrigado!!

    sexta-feira, 19 de setembro de 2014 22:34