Использование объектов класса Tthread

  • Автор темы young
  • Дата начала
Y

young

#1
Привет всем!!! Наверняка многие работали с этим замечательным классом! Поэтому надеюсь получить от вас подсказку=)

Проблема заключается в следующем. стояла задача написать графический компонент, который рисует на канве график функции. А работать с этим компонентом необходимо через трэд. То есть функция рисования вызывается из объекта типа TThread. В качестве Входных параметров функции должен быть массив со значениями точек, по которым строится график. Все это происходит в реалтайме, то есть из внешнего приложения поступает буфер со значениями в трэд, трэд кидает это в функцию рисования, функция рисует. Буфер постоянно меняет свои значения.

Итак, что я сделал. Написал компонент, создал трэд. Но за формирование буфера со значениями отвечал у меня сам поток, а его должно передавать внешнее приложение. Теперь я в ступоре, каким образом сделать динамическую передачу новых значений в поток, да так чтобы все рисовалось в динамике, как на осциллографе. Я все понимаю, что надо проверять обработал ли поток предыдущий буфер. Если ДА, то можно передавать следующий, если НЕТ, то ждать и т.д. Но не могу понять, как это организовать.
 
Y

Yason

#2
Передача данных между приложениями называется межпроцессным взаимодействием (Interprocess communication, IPC). На RSDN есть небольшой обзор разных методов IPC. На Вашем месте, я бы использовал file mapping для буфера, и event для сообщения о готовности буфера. Проверять или не проверять, обработал ли поток предыдущий буфер - зависит от задачи. В случае осциллографа или, например, видеоплеера, "актуальность" отображаемых данных важнее, чем показать каждый кадр; поэтому если новые данные поступили, пока старые не до конца обработаны — забываем про старые, и начинаем отображать новые. О завершении обработки можно сообщить передающему потоку тоже через event.

Альтернативно, можно использовать сокеты для преедачи данных. Тогда всё будет передаваться последовательно одним потоком, а принимающий поток сам выберет, по сколько байт считывать.