Jump to content

Invoke e MultiThreading


Hitmanpt
 Share

Recommended Posts

Boas Pessoal... o problema é o seguinte.... eu tenho uma form chamada adminCP e uma module com a seguinte estrutura

Module updateLists

Public Class updatePlayersList

Event updateUI
'.... O resto do codigo

Private Sub updateUI_Handler() Handles Me.updateUI
Dim itm As ListViewItem
            itm = New ListViewItem(id.ToString(), 0)
            itm.SubItems.Add(Username)
            itm.SubItems.Add(TeamName)
            itm.SubItems.Add(Status)
            If checkIn = 1 Then
                itm.SubItems.Add("SIM")
            Else
                itm.SubItems.Add("NÃO")
            End If
            itm.SubItems.Add(firstName)
            itm.SubItems.Add(lastName)
            itm.SubItems.Add(email)
            itm.SubItems.Add(telm)
adminCP.Invoke(Sub() adminCP.lstPlayers.Items.Add(itm))
End Sub

End Class

End Module

E na form tenho este codigo

Public Class adminCP

Dim updatePlayersLST As Thread

Private Sub adminCP_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim updatePlayersListClass As updateLists.updatePlayersList = New updateLists.updatePlayersList
        updatePlayersListClass.MasterAddress = MasterAddress
        updatePlayersLST = New Thread(AddressOf updatePlayersListClass.updatePlayerslst)
        updatePlayersLST.Start()

End Sub

End Class

O problema é o seguinte eu estou a utilizar multithreading e para ter o codigo da form mais limpo estou a separar.... visto que o codigo é enorme para estas operações...

E quando faz o RaiseEvent e chega a esta linha "adminCP.Invoke(Sub() adminCP.lstPlayers.Items.Add(itm))" dá-me este erro "Não é possível chamar Invoke ou BeginInvoke num controlo até o identificador de janela ser criado."

Se tirar o Invoke não me aparece nada na ListView.... alguma ajuda?  😕

Link to comment
Share on other sites

Continuo sem conseguir.... meti o codigo que estava no load da form para um botão e msm assim dá o msm erro 😉

EDIT

Agora na form para alem do codigo que tinha adicionei este

Private Delegate Sub UpdateUIInvoker(ByVal item As ListViewItem)

    Public Sub UpdateUI(ByVal itm As ListViewItem)

        If Me.lstPlayers.InvokeRequired Then
           Dim d As New UpdateUIInvoker(AddressOf UpdateUI)
            Me.Invoke(d, lstPlayers, {itm})
        Else
            lstPlayers.Items.Add(itm)
        End If
    End Sub

E na class substitui

adminCP.Invoke(Sub() adminCP.lstPlayers.Items.Add(itm))

por

adminCP.UpdateUI(itm)

agora nao me dá erro... simplesmente nao me aparece nada...

Link to comment
Share on other sites

Problema resolvido dps de alguns dias à cabecada :X

Na class adiciona-se este codigo

 Private m_frm As adminCP
        Public Sub New(ByVal frm As adminCP)
            m_frm = frm
        End Sub

Na form

 Dim updatePLList As New updateLists.updatePlayersList(Me)
updatePLList.MasterAddress = MasterAddress
        updatePlayersLST = New Thread(AddressOf updatePLList.updatePlayerslst)
        updatePlayersLST.Start()

e dps é só fazer o Invoke

adminCP.lstPlayers.Invoke(Sub() adminCP.lstPlayers.Items.Add(itm))
Link to comment
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
 Share

×
×
  • Create New...

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.