powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Parallel Programming Library TTask+Timer
17 сообщений из 17, страница 1 из 1
Parallel Programming Library TTask+Timer
    #39461700
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу помощи в следующем вопросе.
Объект класса назовем его "ccm" имеет функцию получения данных.
В ТТimer "Тimer” идет обращение к функции считывания.

ccm->GetResult((TBufferCast *)&Result)

и последующая обработка полученных результатов
1. Показать данные в виде графиков
2. записать данние в файл.
3. посчитать на основании данных чтото
4. показать это чтото опять на графиках.

и все бы ничего но показ графиков "ТChart" реально тормозит запись и подвешивает всю работу расчетов.

Была слабая попытка исползовать ТТаsk
но отсутствие знаний опыта в этом вопросе "и хреновая звездограмма :)"
не дают желаемого результата.

Код попытки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
//////////////////////////////////////////////////////////////////////////////////////
class TCppTask : public TCppInterfacedObject<TProc>
{
public:
TBuffer CCMResult;

int ii; 

TCppTask(TBuffer CCMResult )
{
ii = CCMResult.Rpm ;
}
void __fastcall Invoke()
{
String s= IntToStr(ii);
FormMain->Label_RPM->Caption = s ; 
Sleep(1000);
//вместо Sleep()   подставляем множество параметров необходимых для показа
// параметров очень много один из них7000 точек на ТChart.
}
};
//////////////////////////////////////////////////////////////////////////////////////////
TFormMain::TimerRequestTimer(TObject *Sender)
if (ccm->GetResult((TBufferCast *)&Result)>0)
{
...запись данных..

_di_ITask task = TTask::Create(_di_TProc(new TCppTask(Result))); 
task->Start();  

... расчеты данных..

if (Reactivate) { TimerRequest->Enabled = true;..//таймер работает покаего не остановят.
}




Теперь о наболевшем!
- если таск успевает показат графики до оканчания работи таймера Sleep ( скажем 1000) то все ок.
- если нет Sleep ( предположим 8000) то создается новый таск в заново стартонувшем таймере снова и снова пока не подвешивает прогу.

Как быть и что делать ?
с ув Виктор !
П.С. пытался определит в разных местах статусы типа if (task->Status == ТТаskStatus::Completed)
но при "Sleep ( много данных 8000)" не помогает. Тimer перестартовывает раньше.

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39461798
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikи все бы ничего но показ графиков "ТChart" реально тормозит запись и подвешивает всю работу расчетов.Давайте код показа графиков. Там куча мест для оптимизации. Самое банальное, это выводить так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Chart1.AutoRepaint := False;
try
  Series1.BeginUpdate;
  try
    // Здесь вывод точек
  finally
    Series1.EndUpdate;
  end;
finally
  Chart1.AutoRepaint := True;
  Chart1.Refresh;
end;

Если точек много, то имеет смысл использовать TFastLine. Также, возможно придется организовать прореживание из расчета не более 1 точки на пиксел. + учитывать ограничение осей.

Автомасштабирование осей лучше выключить
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39461800
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Операции с интерфейсом и соответственно с графикой в TChart нельзя производить вне основного потока.

В TTask перенесите работу с данными а в onTimer перерисовывайте графики по данным, когда они будут подготовленны другими потоками.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39461911
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

Код: plaintext
1.
2.
3.
 Поток1: SetWaitableTimer: таймаут  -> функция считывания -> буфер a/b -> установить флаг2,3 
 Поток2: ждать флаг2 -> записать данние(буфер a/b) в файл 
 Поток3: ждать флаг3 -> посчитать на основании данных (буфер a/b) чтото -> подготовить точки для графикаA/B -> послать сообщение0, 
 Поток0: ждать сообщение0 -> рисовать графикA/B
+
_Vasilisk_организовать прореживание из расчета не более 1 точки на пиксел. + учитывать ограничение осей.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462064
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,
Спасибо огромное за ответы. С оформлением буду по внимательнее. Порядок есть порядок.
Что касается оптимизации графиков, там все оптимизированно. И TFastLine и колличество точек при масштабировании и многое другое.

rgreat пишет
" Операции с интерфейсом и соответственно с графикой в TChart нельзя производить вне основного потока. "
хотелось бы по подробнее почему. где почитать.
есче rgreat пишет
В TTask перенесите работу с данными а в onTimer перерисовывайте графики по данным, когда они будут подготовленны другими потоками.
Дело в том что я не могу изменить структуру программы. я могу только усовершенствовать. На таймере завязанны многие отдельные процессы. например при одном проходе таймера данные на приборе с которого считывается инфа сбрасываются для получения и формирования следующего пакета данных.
Другими словами в начале таймера данные полученны в конце удалены. Идея заключается в том что данные для отрисовки не обязательно показывать при каждом проходе таймера. Важно каждый проход записывать.А вот отображение графиков только после завершения потока тоесть рисования. Таск получает новую порцию данных и дальше живет своей жизнью пока не закончит рисовать. Прерывать на ожидание останавливать или задерживать работу таймера нельзя. Он синхронизирован с прибором для получения данных по времени.

как то так.
С ув. Виктор.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462102
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

Есче раз другими словами.
В таймере создать таск и запустить паралельно но уже (наверное) независимо от таймера.
При этом передать параметры полученные внутри таймера!!
По завершении или убить или перезапустить.

задача частично решена примитивным образом но (интуитивно чувствую)может быть проблемма. Хотелось бы элегантности в коде. Ну и о оптимизации не забывать
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462235
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

TChart не задумывался как средство динамического показа больших данных
да, удобный
да, простой

но никак не RealTime


Если танцы с бубном TChart не помогут, то рисовать самому. В этом нет ничего сложного, буфер + разумная отсечка невыводимых точек + Polyline и вас не догонят
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462250
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

да я на все сто согласен. у меня задача отловить конец выполнения таска созданного в таймере
если поможет я набросал схемку в форуме с++ не хчу флудить поэтому просто ссылка

http://www.sql.ru/forum/1261482/parallel-programming-library-ttask-timer-c
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462266
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462272
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

и как это относится к конструктору таска который в верху тпика? я не против типа учи матчасть. я против иди почитай. если вы поняли о чем это я.

Как узнать окончание работы таска отлов типа
не помогает
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462286
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты спросил что делать, я сказал - переноси отрисовку в основной поток, а работу с данными в фоновый.
Тебе не понравилось. Ок.

Ты спросил как избежать повторных срабатываний до завершения рисования - я ответил - используй CriticalSection.
Опять - не то.

Давай уж сам тогда.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462312
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

да я пытаюсь сам. не выходит. чеб я здесь тогда подьедался.

Только к сожалению ответы не в тему. Боже упаси. Без обид. Поскольку я не знаю как. не могли бы вы показать на примере моего класса. топик вверху. Созданного обьекта в таймере. Куда я должен привинтить эту критическую секцию. Ну очена надо.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462315
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

тобиш как отловить окончаие таска не останавливая не блкируя не синхронизируя. узнать окончание таска:)
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462329
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komvikтобиш как отловить окончаие таска не останавливая не блкируя не синхронизируя. узнать окончание таска:)
Банальным булевым флагом?
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462476
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может TTask проще поменять на обычный TThread? Тут обёртки еще делали, может их посмотреть? Зачем именно TTask? Окончание TThread'а ловится без проблем. Сложно сказать насчет TTask'а, в моей версии пока его нет.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462539
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikkomvik,

а хочется чего то чистого светлого ну вы меня понимаете
ручной Event выставляй и в потоке цикл с его ожиданием

в таймер
Код: pascal
1.
event.SetEvent



в потоке

Код: pascal
1.
2.
3.
4.
5.
6.
while not terminated do
  event.Wait

   Work ...
   event.Reset
end
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer
    #39462674
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господи, откуда только такие берутся...
Сначала транслитом писал, хотя есть
куча онлайн-переводичков и трансляторов.
Потом код без SRC постил, ну и наконец
стал постить код картинками. Ппц.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Parallel Programming Library TTask+Timer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]