Общение с другим потоком - PullRequest
0 голосов
/ 07 марта 2011

Вот так я создаю поток, который делает купирование reps раз:

protected virtual void RedButtonClicked(object sender, System.EventArgs e)
{
    Nuker n = new Nuker(target, reps);
    bombThread = new Thread(new ThreadStart(n.nuke));
    bombThread.Start();
}

Класс резьбы:

public class Nuker
{
    private string target;
    private int reps;
    //...
    public void nuke()
    {
        for(int i=0; i<reps; ++i)
        {
            ICBM.nuke(target);
            Thread.Sleep(5500);
        }
    System.Console.WriteLine("Done.");
    }
}

(я создаю новый класс для хранения некоторых переменных, поскольку не могу передать их в ThreadStart().)

Теперь я хотел бы иметь простую визуализацию процесса, скажем, печать текущего повторения в текстовом поле на форме. Как бы я использовал i из цикла, чтобы сделать это?

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

В простейшей форме вы доказали обратный вызов в Nuker классе

public Nuker (строковая цель, int reps, Action reportCallback) {..}

В цикле вы просто звоните reportCallback(i);

Nuker n = new Nuker(target, reps, ReportMethod);

с

private void ReportMethod(int currentIdx)
{
    if (InvokeRequired) // Invoke if UI update
    ...
}

Но, вероятно, вы хотите использовать BackgroundWorker, который имеет встроенные методы для сообщения о прогрессе в потоке пользовательского интерфейса. Просто посмотрите примеры на MSDN.

0 голосов
/ 07 марта 2011

вы можете сделать это с помощью фонового работника, это один из самых простых потоков :-) ниже я отправлю вам пример, который я создал, чтобы научить некоторых друзей использованию фонового работника; -)

private BackgroundWorker bw = new BackgroundWorker();

public Form1()
{
    InitializeComponent();
    bw.WorkerReportsProgress = true;
    bw.WorkerSupportsCancellation = true;
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}

public void buttonStart_Click(object sender, EventArgs e)
{
    if (bw.IsBusy != true)
        bw.RunWorkerAsync(12); //Start
}

public int Pils(int i)
{
    Thread.Sleep(2000);
    bw.ReportProgress(70, "In the middle of the work..");
    Thread.Sleep(2000);
    bw.ReportProgress(90, "Returning the result..");
    Thread.Sleep(2000);
    return (2 * i);
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    bw.ReportProgress(20, "Waiting for cancel.."); 
    Thread.Sleep(2000);
    if ((bw.CancellationPending == true))
        e.Cancel = true;
    else
    {
        bw.ReportProgress(50, "Starting process..");
        e.Result = Pils((int)e.Argument);
    }
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    bw.ReportProgress(100, "Work done.."); 
    if ((e.Cancelled == true))
         textBox1.Text = "Canceled!";
    else if (e.Error != null)
         textBox1.Text = ("Error: " + e.Error.Message);
    else textBox1.Text = e.Result.ToString();
}

private void buttonCancel_Click(object sender, EventArgs e)
{
    if (bw.WorkerSupportsCancellation == true)
        bw.CancelAsync();
}

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    listBox1.Items.Add((e.ProgressPercentage.ToString() + "%") + " - " + e.UserState as String);
}

URL-адрес блога: ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...