bemidio Postado Fevereiro 16, 2006 Denunciar Share Postado Fevereiro 16, 2006 Alguém conhece um bom link que explique como trabalhar com multithreading? Se alguém puder me ajudar, melhor ainda?Valeu Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 17, 2006 Denunciar Share Postado Fevereiro 17, 2006 Se a sua dúvida for bem específica seria interessante você postá-la aqui. Talvez alguém possa ajudar-lhe no caso.Abraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 §uiciDa£ Postado Fevereiro 18, 2006 Denunciar Share Postado Fevereiro 18, 2006 vem ca gente...o backgroundwork(axo q é isso), do .net 2, é como uma thread ??me parece q sim, mais eu nunca tentei usa-lo...eles tem a mesmo funcionalidade ??t+ Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 18, 2006 Denunciar Share Postado Fevereiro 18, 2006 Sim, de certa forma esta é uma classe que simplifica a criação de um thread para uma determinada operação. Coloque o seguinte código na sua classe do form: Public Delegate Sub Delegação(ByVal texto As String) Public Sub DefinirTexto(ByVal texto As String) If Label1.InvokeRequired Then Dim d As New Delegação(AddressOf DefinirTexto) Label1.Invoke(d, Now.ToString()) Else Label1.Text = Now.ToString() End If End Sub Private Sub Ação(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Do While True DefinirTexto(Now.ToString()) Loop End Sub E o coloque o seguinte no evento Click de um botão qualquer do form: Dim k As New System.ComponentModel.BackgroundWorker AddHandler k.DoWork, AddressOf Ação k.RunWorkerAsync()E coloque também uma label no form (com o nome de Label1). Execute e pressione o botão e você verá a hora passando na label, sem que as outras operações sejam travadas (uma vez que fizemos um loop infinito naquele Do While True, isso deveria ocorrer).Certo? Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 18, 2006 Denunciar Share Postado Fevereiro 18, 2006 Não existe um jeito mais fácil de usar o BackGroundWorker? E o evento 'DOWorker'? Não é só colocar um trecho de código nesse evento?Sim, também é possível fazer assim: Private WithEvents BW As New System.ComponentModel.BackgroundWorker Private Sub BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork Do While True DefinirTexto(Now.ToString()) Loop End SubAbraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Bittencourt Muniz Postado Fevereiro 19, 2006 Denunciar Share Postado Fevereiro 19, 2006 Sobre o BackGroundWorker:Private WithEvents BW As New System.ComponentModel.BackgroundWorker Private Sub BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork Static x As Integer Text = x + 1 End Sub Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click BW.RunWorkerAsync() End SubVocê pode me dizer porque esse trecho de código gerou uma exception?Falows! Link para o comentário Compartilhar em outros sites More sharing options...
0 bemidio Postado Fevereiro 19, 2006 Autor Denunciar Share Postado Fevereiro 19, 2006 Obrigado pela ajuda. Mas vou ter que reformular.A criação simples de threads não é tão complicada e achei conteúdo na internet.A questão é a seguinte. No projeto que estou participando, exige-se que se utilize uma a classe: Threadpool. Esta classe e que é o problema. Não a conheço e o conteúdo que achei tava meio complicado. Obs: O projeto é em C#.Mais uma vez, obrigado. Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 19, 2006 Denunciar Share Postado Fevereiro 19, 2006 Obrigado pela ajuda. Mas vou ter que reformular.A criação simples de threads não é tão complicada e achei conteúdo na internet.A questão é a seguinte. No projeto que estou participando, exige-se que se utilize uma a classe: Threadpool. Esta classe e que é o problema. Não a conheço e o conteúdo que achei tava meio complicado. Obs: O projeto é em C#.Mais uma vez, obrigado. Pela descrição que aparece naquela janelinha amarela (da dica) a classe ThreadPool tem várias utilizações. Se você pudesse dizer exatamente o que quer fazer com ela ficaria mais fácil de ajudar.Abraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 21, 2006 Denunciar Share Postado Fevereiro 21, 2006 Sobre o BackGroundWorker:Private WithEvents BW As New System.ComponentModel.BackgroundWorker Private Sub BW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork Static x As Integer Text = x + 1 End Sub Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click BW.RunWorkerAsync() End SubVocê pode me dizer porque esse trecho de código gerou uma exception?Falows! Porque você está tentando alterar a propriedade Text de um objeto (no caso, o form) que foi criado por outro thread. Não é permitido que um thread mexa com objetos de outro thread, a não ser por delegates (por isso que tive que utilizar uma delegate no outro exemplo).Abraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
0 §uiciDa£ Postado Fevereiro 27, 2006 Denunciar Share Postado Fevereiro 27, 2006 Ae Gray, me ajuda com esse programaele tem 3 listbox, 3 botoes e 3 bgWorks using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace TesteThread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public delegate void mudaTexto(String texto); public void changeText(ListBox lista,String text) { if (lista.InvokeRequired) { mudaTexto a = new mudaTexto(new changeText()); lista.Invoke(a, text); } else { lista.Items.Add(text); } } private void button1_Click(object sender, EventArgs e) { bgW1.RunWorkerAsync(); } private void button2_Click(object sender, EventArgs e) { bgW2.RunWorkerAsync(); } private void button3_Click(object sender, EventArgs e) { bgW3.RunWorkerAsync(); } private void bgW1_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100000; i++) { changeText(listBox1, i.ToString()); } } private void bgW2_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100000; i++) { changeText(listBox2,i.ToString()); } } private void bgW3_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100000; i++) { changeText(listBox3, i.ToString()); } } private void Form1_Load(object sender, EventArgs e) { } } } eu qro q conforme seja clicado em um botao seja feito um loop em cada listbox, só q ta dando erro nesta parte mudaTexto a = new mudaTexto(new changeText()); este erro que dá 'TesteThread.Form1.changeText(System.Windows.Forms.ListBox, string)' is a 'method' but is used like a 'type' brigado pela força...t+ Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 28, 2006 Denunciar Share Postado Fevereiro 28, 2006 Você está chamando a delegate de forma incorreta e além disso, o método deve ter, obrigatoriamente, a mesma assinatura da delegação. Abaixo está a parte corrigida: public delegate void mudaTexto(ListBox lista, String texto); public void changeText(ListBox lista, String text) { if (lista.InvokeRequired) { mudaTexto a = new mudaTexto(changeText); lista.Invoke(a, new object[] { lista, text }); } else { lista.Items.Add(text); } }Para mais detalhes sobre delegates, dê uma olhada neste tópico: http://scriptbrasil.com.br/forum/index.php?showtopic=72745Abraços,Graymalkin Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
bemidio
Alguém conhece um bom link que explique como trabalhar com multithreading? Se alguém puder me ajudar, melhor ainda?
Valeu
Link para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados