Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2008, 17:02   #1
alun
Пользователь
 
Аватар для alun
 
Регистрация: 10.11.2008
Сообщений: 32
Вопрос TThread в С++ Builder

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

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

Итак, что я сделал. Написал компонент, создал трэд. Но за формирование буфера со значениями отвечал у меня сам поток, а его должно передавать внешнее приложение. Теперь я в ступоре, каким образом сделать динамическую передачу новых значений в поток, да так чтобы все рисовалось в динамике, как на осциллографе. Я все понимаю, что надо проверять обработал ли поток предыдущий буфер. Если ДА, то можно передавать следующий, если НЕТ, то ждать и т.д. Но не могу понять, как это организовать.
http://relax-release.ru
alun вне форума Ответить с цитированием
Старый 05.12.2008, 23:02   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А как вы создаете поток? Я думаю вам стоит посмотреть в список добавляемых файлов. Там есть файл, с классом, унаследованым от потока. Добавляете ему необходимые аттрибуты. Пишете свой метод Execute(), а в главной проге просто по таймеру отправляете ему координаты новых точек. При получении новых координат, должен устанавливаться какой-то флаг. Метод Execute() проверяет, установлен ли флаг, и рисует новые точки, если установлен. Но лучше бы это дело синхронизировать через критическую секцию, во избежание всяких там багов с отрисовкой.
MaTBeu вне форума Ответить с цитированием
Старый 05.12.2008, 23:13   #3
alun
Пользователь
 
Аватар для alun
 
Регистрация: 10.11.2008
Сообщений: 32
По умолчанию

Создал класс наследник TTHread, из основного приложения создаю объект потока, потом непосредственно читаю из файла блоками заданного размера, по одному блоку я должен передавать в поток, чтобы он его рисовал. В методе Execute() я вызываю функцию рисования...
http://relax-release.ru
alun вне форума Ответить с цитированием
Старый 05.12.2008, 23:16   #4
alun
Пользователь
 
Аватар для alun
 
Регистрация: 10.11.2008
Сообщений: 32
По умолчанию

Вот код чтения из файла, после каждой итерации цикла массив array должен передаваться в поток. И еще не могу понять, в каком месте надо запускать сам поток, при каждой итерации цикла или как??? Вообще запутался...


Код:
 
  int N = 4096;
  unsigned int *array = new unsigned int [N];
  FILE *F = fopen("IQ.bin","r+b");
  fseek(F,0,2);
  int filesize = ftell(F);
  fseek(F,0,0);
  int filemarker = 0;

  while (filemarker<filesize)
  {
   fread(array,sizeof(int),N,F);
   filemarker += sizeof(int)*N;
  }
http://relax-release.ru
alun вне форума Ответить с цитированием
Старый 05.12.2008, 23:37   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Ну сделайте в вашем классе-потоке метод, которому будет передаваться буфер, а сам метод уже его скопирует себе, для использования.

ПыСы: а вот с вызовом - тут немного замутили. Короче, можно создать поток, сразу с аттрибутом Suspended = true, а когда нада запустить - тогда Suspended = false, но могут возникнуть проблемы с тем, что поток выполниться только один раз, а второй раз уже прога упадет. Поэтому советую сделать (за такое конечно же программистам руки по шею отрубают ) метод типа void Run();, а код его довольно прост
Код:
void MyThread::Run()
{
//ну сюда можна еще залепить вход в крит секцию
     Execute();
//ну а сюде естественно - выход из нее оной
}
А потом в проге постоянно запускаете этот метод Run и все будет акей.
MaTBeu вне форума Ответить с цитированием
Старый 05.12.2008, 23:50   #6
alun
Пользователь
 
Аватар для alun
 
Регистрация: 10.11.2008
Сообщений: 32
По умолчанию

О, Боже!!! Оно работает)))))))
Ну спасибо Вам
http://relax-release.ru
alun вне форума Ответить с цитированием
Старый 06.12.2008, 00:52   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

И еще посоветую вам посмотреть в сторону стандартного компонента в Borland C++ Builder. Называется он PerformanceGraph (это на вкладке Samples). Этот компонент в Диспетчере задач виндовом отображает загрузку процессора и так далее. Я думаю в вашем случае будет самое оно
MaTBeu вне форума Ответить с цитированием
Старый 02.06.2010, 21:55   #8
elpilasgsm
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 20
По умолчанию

А если мне надо сделать сразу несколько потокоа, при чем их количество заранее не известно, рассчитвается уже в процессе выполения программы. Тогда как быть??
elpilasgsm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47
БД C++ Builder 6 ZiKx C++ Builder 1 07.08.2008 20:43
использование TThread amandra Общие вопросы Delphi 6 03.05.2008 03:13
Stack owerflow - глюки с TThread IOrist Общие вопросы Delphi 4 11.11.2007 09:13
Как отследить завершение выполнения потока TThread? Трик Общие вопросы Delphi 3 24.10.2007 14:55