AJUDA COM THREAD

SABIDAOXD 20/07/2012 09:27:18
#406327
estou fazendo o jogo em C# mas se eu souber como faz em vb.net eu ja sei como vou fazer em C#
PEGUDO 20/07/2012 09:59:01
#406328
Resposta escolhida
Cara,
Pra este tipo de coisa será preciso criar uma [Ô][txt-color=#0000f0]Delegate[/txt-color][Ô] e uma Sub para realizar esta tarefa:
Veja um trecho de um programa meu que faz busca em uma planilha Excel e mostra o progresso das células buscadas em um Label. Como o Label está no Form e o código rodando em no Run do BackGroundWorker, ou seja em Threads diferentes, precisei usar o [txt-color=#0000f0]Invoke[/txt-color] do Label para que ele pudesse mostrar o progresso.
Estou usando um [txt-color=#0000f0]BackGroundWorker[/txt-color] mas acho que serve para [txt-color=#0000f0]Thread[/txt-color] também.
Aqui crio o BackGroundWorker:
Imports System.ComponentModel
Public Class Form1
Public WithEvents BGW_Work As New BackgroundWorker

e logo abaixo eu Crio o Delegate:
Public Class Form1
Public WithEvents BGW_Work As New BackgroundWorker
Private Delegate Sub iQualStatus(ByVal QualLabel As Label, ByVal QualOpcao As Int32)

Agora eu Crio a Sub que o Label vai invocar (Chamar):
Public Sub QualStatus(ByVal QualLabel As Label, ByVal QualOpcao As Int32)
[txt-color=#0000f0]Select Case[/txt-color] QualOpcao
[txt-color=#0000f0]Case[/txt-color] 1
QualLabel.Text = [txt-color=#e80000][Ô]Lendo emails do arquivo...[Ô][/txt-color]
Case 2
QualLabel.Text = [txt-color=#e80000][Ô]Verificando se existem emails repetidos...[Ô][/txt-color]
Case 3
QualLabel.Text = [txt-color=#e80000][Ô]Excluindo emails repetidos...[Ô][/txt-color]
Case 4
QualLabel.Text = [txt-color=#e80000][Ô]Salvando arquivo...[Ô][/txt-color]
Case 5
QualLabel.Text =[txt-color=#e80000] [Ô]Abrindo arquivo...[Ô][/txt-color]
[txt-color=#0000f0]End Select
End Sub[/txt-color]


Agora, no evento DoWork do BackGroundWorker, eu uso o invoke do Label:

[txt-color=#007100]... Código antes[/txt-color]
lblStatus.Invoke([txt-color=#0000f0]New[/txt-color] iQualStatus([txt-color=#0000f0]AddressOf[/txt-color] QualStatus), lblStatus, 4)
[txt-color=#007100]...Código depois[/txt-color]

[txt-color=#007100][ô]EXPLICANDO A LINHA ACIMA
[ô]lblStatus é o nome do meu Label;
[ô]Depois de [Ô]New[Ô], eu chamo o Delegate iQualStatus, sem os parâmetros (Pode ser o nome que você quiser, eu costumo colocar o nome parecido com a da Sub que ele vai chamar);
[ô]Depois de [Ô]New iQualStatus(AddressOf QualStatus)[Ô], eu coloco os parâmetros: O controle que vai usar o invoke (lblStatus) e a opção (neste caso o nº 4);
[ô]Neste caso o lblStatus vai invocar (chamar) a Sub QualStatus e vai mostra a opção 4 (Salvando arquivo...), se fosse a opção 2 escreveria [Ô]Verificando se existem emails repetidos...[Ô][/txt-color]

Assim, mesmo rodando numa Thread diferente (no BackGrounWorker) o código conseguirá escrver no Label (lblStatus) que está no Form1.
Nunca usei este tipo de prática em PictureBox. Veja se este controle tem o Invoke e tente fazê-lo.

Espero ter sido bastante claro e ter ajudado também.
SABIDAOXD 20/07/2012 10:31:02
#406338
isso foi muito útil para mim PEGUDO, obrigado, ele funciona sim, mas eu queria fazer a imagem se mover sem travar a form, eu usei o seu exemplo tbm, ele move a imagem mas trava a form, fiz da seguinte maneira

As declarações
Citação:

Dim asda As PictureBox
Dim kkk As MethodInvoker
Public WithEvents BGW_Work As New BackgroundWorker
Private Delegate Sub suu(ByVal QualLabel As PictureBox)



Esse sub faz a imagem ser criada e se mover na form
Citação:

Public Sub yyy()
Dim asda As New PictureBox
asda.BackColor = Color.CadetBlue
asda.Left = 0
asda.Top = 0
asda.Width = 10
asda.Height = 10
asda.BringToFront()
Controls.Add(asda)
While asda.Left < 100
asda.Left += 1
Thread.Sleep(5)
asda.Refresh()
End While
End Sub



no dowork eu coloquei pra ele chamar o sub que faz a imagem se mover
Citação:

Private Sub BGW_Work_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW_Work.DoWork
Me.Invoke(New suu(AddressOf yyy), asda)
End Sub



e no click que faz criar a imagem eu coloquei
Citação:

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BGW_Work.RunWorkerAsync()
End Sub



na form load para a thread ter permissão eu coloquei
Citação:

Control.CheckForIllegalCrossThreadCalls = False



Agora eu precisava fazer isso sem travar o programa principal, porque quero ir clicando no botão várias vezes e ele ir criando várias imagens seguida
SABIDAOXD 20/07/2012 10:33:40
#406339
Como não sei explicar direito, olhe o projeto eu quero clicar várias vezes no botão e ele ia criando várias imagens seguindas
PEGUDO 20/07/2012 10:51:28
#406340
Ok. To no trabalho e um pouco atarefado.
Vou dar uma olhada mas talvez demore pra te dar uma respoosta, ok?
SABIDAOXD 20/07/2012 11:13:38
#406341
eu consegui, criei uma trhead com parametro de um sub e deu certo, obrigado a todos
Página 2 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas