как передать параметры в мой поток? - PullRequest
1 голос
/ 16 июля 2011

У меня есть программа, которую я написал на C # с окном.

У меня есть кнопка, которая делает некоторые вещи (неважно, что именно), и она обновляет окно в его цикле (в функции button_click) (с помощью this.Invalidate (false); Обновить, потому что у меня есть групповой ящик, который я не хочу обновлять)).

Я не могу свернуть окно, пока работает функция button_click, и окно "застряло".

Я пытаюсь перевести код этой кнопки в другой поток, но есть проблема с обработкой параметров из основной формы. допустим, у меня есть этот код:

void button_click(object sender, EventArgs e)
{
    /*want to put this in new thread*/
    progressBar1.Value = 0;
    progressBar1.Maximum = int.Parse(somelabel_num.Text);
    int i;
    OpenFileDialog file = new OpenFileDialog();
    file.ShowDialog();
    if (file.FileName == "")
        return;
    Bitmap image = new Bitmap(file.FileName);
    groupBox1.BackgroundImage = image;

    for (i = 0; i < int.Parse(somelabel_num.Text); i++)
    {
        somelabel.Text = i;
        this/*(main form)*/.Invalidate(false);
        progressBar1.PerformStep();
    }
    /*want that here the new thread will end*/
}

так, как сделать это как поток, который получает параметры (progressBar1, groupBox1 и somelabel)?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Вы можете использовать ParameterizedThreadStart Delegate , который принимает объект типа в качестве параметра. Таким образом, вы можете создать свой собственный класс, который содержит 3 свойства (progressBar1, groupBox1 и somelabel), и передать этот объект вашему потоку, и там вы можете привести его обратно к вашему типу класса и делать все, что захотите.

Вы только что изменили свой вопрос, и я вижу, что вы хотите поместить среднюю часть в отдельный поток, и вы хотите, чтобы этот поток взаимодействовал с потоком. Помните, что в пользовательском интерфейсе только один (основной) поток может иметь дело с пользовательским интерфейсом, а не рабочий поток. Рабочий поток должен отвечать за некоторые расчеты / работу, но не за взаимодействие с пользовательским интерфейсом (ShowDialog в вашем случае). Вам следует подумать, чтобы изменить логику того, что должен делать ваш фон.

Чтение Обновление пользовательского интерфейса из вторичного потока от Теда Паттисона о том, как вызывать пользовательский интерфейс из другого потока. В WindForms это не так просто, в WPF это намного проще.

0 голосов
/ 16 июля 2011

Вы можете попробовать что-то подобное:

void button_click(object sender, EventArgs e)
{
OpenFileDialog file = new OpenFileDialog();
file.ShowDialog();
if (file.FileName == "")
    return;
else
 {
    Bitmap image = new Bitmap(file.FileName);
    Thread t = new Thread (new ParameterizedThreadStart(MyFunction));
    t.Start (new MyClass(progressbar1,groupbox1,label1,image));

 }
}

целевая функция здесь:

void MyFunction(object obj)
{
MyClass myc= (MyClass) obj;
myc._mypbar; /*can access varriables*/

/* your logic*/

}

Класс инкапсуляции ProgressBar, GroupBox, Labels:

public class MyClass
{ 
public ProgressBar _mypbar;
public GroupBox _mygpb;
public Label _mylbl;
public Image _myimg;

public MyClass(ProgressBar pbar,GroupBox gpb, Label, lbl,Image img)
{
this._mypbar = pbar;
this._mygpb = gpb;
this._mylbl = lbl;
this._myimg = img;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...