Потоки и 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д