Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dotinho

Problemas com threads e multithreading

Recommended Posts

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

Share this post


Link to post
Share on other sites
jpaulino

Ou usas um Delegate, para poderes aceder a controlos dessa forma, ou um BackGroundWorker().

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.