Потоки и InvokeRequired - C#
Формулировка задачи:
Здравствуйте! Есть пример, он работает, но честно говоря через 5 точку, не так как ожидается.
Есть два потока, основной, в котором работает программа, и второй поток, в котором происходит считывание данных с встроенного АЦП(плата pciе).
Для перехода во второй поток используется это:
и сама функция Вначале определяется:
Вопрос заключается в самом процессе выход из 2 потока обратно в основной. InvokeRequired - как я понял это флаг, говорящий о возможности прекратить 2 поток, Invoke фактически производит переход из 2 в основной.
НО! По какому событию срабатывает сам InvokeRequired??? как задать, допустим, для этого значение в 100мсек?(каждые 100мс чтобы переходил из 2 в основной?)
Thread thread = new Thread(this.threadFunc);
threadRun = true;
thread.Start();threadFunc
соответственно:while()
{ считываем данные с АЦП......
UpdateDataStream();
}UpdateDataStream
:private void UpdateDataStream()
{
if (this.InvokeRequired)
{
this.Invoke(new updateDateDelegate(this.UpdateDataStream));
}
else
{
ЗДЕСЬ, Я НАМЕРЕВАЮСЬ, ИСПОЛЬЗУЯ МАССИВ ИЗ threadFunc(), построить точки на графике,
}
}private delegate void updateDateDelegate();
Решение задачи: «Потоки и InvokeRequired»
textual
Листинг программы
//этот метод работает в контексте вторичного потока
void threadFunc()
{
while(true)
{
//считываем данные с АЦП......
int data = 0; //например, это данные с АЦП
Thread.Sleep(100);
SynchronizationContext context = SynchronizationContext.Current;
context.Post(x => UpdateDataStream(data), null);
}
}
//а этот метод будет выполнен в контескте первичного потока
void UpdateDataStream(int data)
{
//Print(data);
}