Как организовать обмен данными между потоками ?
От: _Set_  
Дата: 31.03.06 07:24
Оценка:
private void btnStart_Click(object sender, EventArgs e)
{
mytread = new Thread(new ThreadStart(this.f0));
mytread.Start();
}
private void f0()
{
int i=0;
while (i != 6)
{
this.label1.Text = i.ToString();
Thread.Sleep(1000);
}
}
при запуске заявляет, что ресурс this.label1.Text объявленный в другом потоке недоступен в этом.

Использование делегатов и свойства InvokeRequired дают возможность записать, но тогда непонятно как вернуться обратно, чтобы Thread.Sleep(1000); усыпляло не основной поток(форму), а mytread ??
Re: Как организовать обмен данными между потоками ?
От: xexe2  
Дата: 31.03.06 07:45
Оценка:
Control.Invoke или Control.BeginInvoke
ну вроде и все:)
Re[2]: Как организовать обмен данными между потоками ?
От: _Set_  
Дата: 31.03.06 14:08
Оценка:
Здравствуйте, xexe2, Вы писали:

X>Control.Invoke или Control.BeginInvoke

ну вроде и все

Ну а обратно в поток как вернуться ??
если а напишу так :
partial class Form1
{
.....
delegate void MyDelegate ();
.....
}
private void f0()
{
int i=0;
while (i != 6)
{
if(label1.InvokeRequired)
{
MyDelegate d = new MyDelegate(f0);
this.Invoke(d); // здесь он перезапустит функцию f0() уже в основном потоке
}
else
{
this.label1.Text = i.ToString();
i++;
Thread.Sleep(1000); // и тогда спать я отправлю уже форму а не свой поток
}
}
}
а как сделать чтобы поток работал, периодически записывая данные в форму, но не прерывая работы. Вроде таймера. Нужно то, чтобы форма была в состоянии обрабатывать свои запросы(нажатие кнопок например), и приходящие данные с потока своевременно отображались.
Как организовать обмен данными между потоками ?
От: Аноним  
Дата: 31.03.06 07:48
Оценка:
Нарисованно на коленке, в связи с чем не претендует на 100% работоспособность, но на мысль навести должно...
private void btnStart_Click(object sender, EventArgs e)
{
mytread = new Thread(new ThreadStart(this.f0));
mytread.Start();
}
private void f0()
{
int i=0;
while (i != 6)
{
label.Invoke(new Delegat(SetText), i);
//this.label1.Text = i.ToString();
Thread.Sleep(1000);
}
}
void SetText(object[] param)
{
label1.Text = param[0].ToString();
}
can be done...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.