Ir para conteúdo
Fórum Script Brasil
  • 0

Multithread


bemidio

Pergunta

10 respostass a esta questão

Posts Recomendados

  • 0

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? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

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 Sub

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

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 Sub

Você pode me dizer porque esse trecho de código gerou uma exception?

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

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

  • 0
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

  • 0
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 Sub

Você 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

  • 0

Ae Gray, me ajuda com esse programa

ele 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

  • 0

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=72745

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...