Jump to content
Fórum Script Brasil
  • 0

Multithread


bemidio

Question

10 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...