потокобезопасность в GUI
От: LoparevSV Россия  
Дата: 28.07.08 04:46
Оценка:
Подскажите, пожулайста, вариант решения следующей проблемы.

Есть класс, в котором срабатывает событие, необходимо на форме обновить GUI, например так:

private void MainForm_Load(object sender, EventArgs e)
{
    MyClass class = new MyClass();
    class.MyEvent += new MyEventHandler(class_MyEvent);

    ...
}

void class_MyEvent()
{
    label1.Text = "text";
}


во время срабатывания события происходит эксепшн, что я пытаюсь изменить label1 из другого потока.
Вижу только такое решение, с использованием таймера:

private bool newData = false;

...

void class_MyEvent()
{
    newData = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    if (newData)
    {
        newData = false;
        label2.Text += "text";
    }
}


Подскажите более правильное и красивое решение

28.07.08 11:53: Перенесено модератором из '.NET' — AndrewVK
потокобезопасность gui .net c#
Re: потокобезопасность в GUI
От: _Dreamer Россия  
Дата: 28.07.08 05:34
Оценка:
Здравствуйте, LoparevSV, Вы писали:

LSV>Подскажите, пожулайста, вариант решения следующей проблемы.


LSV>Есть класс, в котором срабатывает событие, необходимо на форме обновить GUI, например так:


LSV>во время срабатывания события происходит эксепшн, что я пытаюсь изменить label1 из другого потока.

LSV>Вижу только такое решение, с использованием таймера:
LSV>Подскажите более правильное и красивое решение

Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.
thread safety controls
Re[2]: потокобезопасность в GUI
От: Аноним  
Дата: 28.07.08 06:28
Оценка:
Здравствуйте, _Dreamer, Вы писали:

_D>Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.


Можно еще на совсем плохой вариант типа Control.CheckForIllegalCrossThreadCalls посмотреть.
Re[2]: потокобезопасность в GUI
От: LoparevSV Россия  
Дата: 28.07.08 07:12
Оценка:
_D>Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.

ну как я понимаю, этот вариант возможен, если мне нужно изменить свойство в каком-то одном контроле (как в моем примере label.text), а если всю форму с кучей контролов изменить надо? или я что-то недопонимаю...
Re: потокобезопасность в GUI
От: Аноним  
Дата: 28.07.08 07:20
Оценка:
Для работы с GUI из другого потока можно использовать BackgroundWorker, его событие DoWork выполняеться в нужном потоке.
Re[3]: потокобезопасность в GUI
От: LoparevSV Россия  
Дата: 28.07.08 07:51
Оценка:
_D>>Смотрите такие вещи, как InvokeRequired property, методы Invoke, BeginInvoke, EndInvoke.

LSV>ну как я понимаю, этот вариант возможен, если мне нужно изменить свойство в каком-то одном контроле (как в моем примере label.text), а если всю форму с кучей контролов изменить надо? или я что-то недопонимаю...


Вы имели в виду что-то вроде такого?

delegate void RefreshDataHandler();

private void MainForm_Load(object sender, EventArgs e)
{
MyClass class = new MyClass();
class.MyEvent += new MyEventHandler(class_MyEvent);

...
}

void class_MyEvent()
{
this.Invoke(new RefreshDataHandler(RefreshData));
}

void RefreshData()
{
label1.Text = "text";
label2.Text = "text";
}
Re[4]: потокобезопасность в GUI
От: _Dreamer Россия  
Дата: 28.07.08 08:55
Оценка:
Здравствуйте, LoparevSV, Вы писали:

LSV>Вы имели в виду что-то вроде такого?


LSV>delegate void RefreshDataHandler();


LSV>private void MainForm_Load(object sender, EventArgs e)

LSV>{
LSV> MyClass class = new MyClass();
LSV> class.MyEvent += new MyEventHandler(class_MyEvent);

LSV>void class_MyEvent()

LSV>{
LSV> this.Invoke(new RefreshDataHandler(RefreshData));
LSV>}

LSV>void RefreshData()

LSV>{
LSV> label1.Text = "text";
LSV> label2.Text = "text";
LSV>}

да, Вы же в первом посте что-то подобное хотели сделать.
это по каким-то причинам Вам не подходит ?
Re[5]: потокобезопасность в GUI
От: LoparevSV Россия  
Дата: 28.07.08 09:17
Оценка:
_D>да, Вы же в первом посте что-то подобное хотели сделать.
_D>это по каким-то причинам Вам не подходит ?

Нет, в первом посте я через таймер делал. Меня интересует наиболее правильный вариант, каким образом изменять контролы в GUI, когда происходит событие из стороннего класса
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.