Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dotinho

Problemas com threads e multithreading

Mensagens Recomendadas

Dotinho

Boa noite pessoal, venho cá pedir uma mãozinha.

É o seguinte, eu queria usar multithreading, mas dá-me sempre este erro "Additional information: A operação entre threads não é válida: controlo 'PT_LInfo' acedido a partir de um thread diferente do thread onde foi criado."


Private th_sync As New Thread(AddressOf S_Sync)

  Private Sub SI_StartSync()
        th_sync.Start()

    End Sub

    Private Sub S_Sync()
        For i = 0 To 50
            PA_Linfo.Text = i.ToString
        Next
    End Sub 

Sendo new thread ou threadpool, é a mesma coisa. alguém já teve esse problema ou tem alguma solução?

cmps


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

o BackgroundWorker faz a mesma coisa do threadm da aquele erro...

O que quero é executar funções pesadas, mas sem interferir com o UI, ou seja, por exemplo, copiar varios ficheiros, o UI fica parado para poupar recursos e não consigo mostrar a percentagem do processo nem nada. E quero mostrar os processos, e onde vai, o que está a acontecer, mas assim nao da..

cmps


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpaulino

Vê este exemplo ... tenta adaptar e de tiveres dúvidas diz:


Imports System.Threading 
  
Public Class Form1 
  
    Dim lvThread As Thread 
  
    Delegate Sub lvDelegate(ByVal item As ListViewItem) 
    Private performUpdate As New lvDelegate(AddressOf UpdateListView) 
  
  
    Private Sub lvThreadMain() 
  
        For x As Integer = 0 To 1000 
  
            Dim newItem As New ListViewItem 
            newItem.Text = x.ToString 
            newItem.SubItems.Add(Now.ToLongTimeString()) 
  
            performUpdate.BeginInvoke(newItem, Nothing, Nothing) 
            Thread.Sleep(50) 
        Next 
  
    End Sub 
  
  
    Private Sub UpdateListView(ByVal item As ListViewItem) 
  
        If Me.InvokeRequired Then 
            Dim d As New lvDelegate(AddressOf UpdateListView) 
            Me.Invoke(d, New Object() {item}) 
        Else 
            Me.ListView1.Items.Add(item) 
        End If 
  
        Debug.WriteLine("Done!") 
    End Sub 

  
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
        lvThread = New Thread(AddressOf lvThreadMain) 
        lvThread.Priority = ThreadPriority.Highest 
        lvThread.IsBackground = True 
        lvThread.Start() 
    End Sub 

 

End Class

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

Boas, eu fiz tudo de novo, e funcionou até agora...

Apenas acrescentei este bocado de código:

   If Date.Equals(dfd, dfo) = False Then
                        File.Delete(fd)
                        FX_CopyFile(fo, fd)
                        FX_Log("Substituido " & vbTab & fo.Substring(_ori.Length))
                    End If

e da-me o erro no thread a fazer esta operação:

 files = My.Computer.FileSystem.GetFiles(_ori, FileIO.SearchOption.SearchAllSubDirectories, "*.*").ToArray

O que não tem nada a ver, porque o erro que dá é ao escrever numa label. O que também não entendo porque :D


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nokPT

Uma Tread não pode escrever ou alterar a parte gráfica do programa principal.

Há várias maneiras de fazer isso, uma é o delegate (que não sei muito bem o que é, mas tenho a ideia que pedes ao programa original para quando poder, ou seja quando não estiver a usar, escrever o que queres), outra mais simples, mas não tão bonita, é escreveres numa variável global o texto que queres e depois na form onde está a label metes um timer que vai alterar o valor da label para o valor que está na variável global.


Ricardo Timóteo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

Desculpa, mas há uns minutos atras, estava a trabalhar bem, e era o thread que estava a escrever na label, aliás, várias label e uma progressbar..

Mas depois, não sei porque, passa a dar erro :D


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

Já tentei instalar o delegate, e parece que funciona bem..

   Delegate Sub D_PT(ByVal Info As String, ByVal TRest As String, ByVal Progress As Integer)
    Delegate Sub D_PA(ByVal Info As String, ByVal FO As String, ByRef FD As String, ByVal Progress As Integer)
    Private UPD_PT As New D_PT(AddressOf SUPD_PT)
    Private UPD_PA As New D_PA(AddressOf SUPD_PA)

    Private Sub SUPD_PT(ByVal Info As String, ByVal TRest As String, ByVal Progress As Integer)
        PT_LInfo.Text = Info : PT_LMin.Text = TRest
        PT_Pb.Value = Progress : PT_Lp.Text = Progress & "%"
    End Sub
    Private Sub SUPD_PA(ByVal Info As String, ByVal FO As String, ByRef FD As String, ByVal Progress As Integer)
        PA_Linfo.Text = Info
        PA_FO.Text = FO : PA_FD.Text = FD
        PA_Pb.Value = Progress : PA_Lp.Text = Progress & "%"
    End Sub

E da uma performance assustadora...mas a janela, actualiza com alguns soluços...e depois o windows diz que não ta aresponder, mas eu sei que está. Até ja usei o Application.DoEvents(), mas nao resultou..

cmps e obrigado :D


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

Pessoal, com o Delegate, só tem um problema, numa determinada altura, a janela pisca, e os controls começam a subir não sei porque... já aconteceu a alguem?

cmps


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.