powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Parallel Programming Library TTask+Timer (c++)
25 сообщений из 52, страница 1 из 3
Parallel Programming Library TTask+Timer (c++)
    #39461701
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток!

Прошу помощи в следующем вопросе.

Объект класса назовем его "ccm" имеет функцию получения данных.

В TTimer "Time" идет обращение к функции считывания

Код: plaintext
1.
ccm->GetResult((TBufferCast *)&Result)



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

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

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

Код: 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.
35.
//////////////////////////////////////////////////////////////////////////////////////
 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);
       //  vmesto sleep podstavljaem mnogestvo parametrov neobhodimich dlja pokaza
	// parametrov och mnogo odin iz nich 7000 tochek na TChart.
	}
};
//////////////////////////////////////////////////////////////////////////////////////////
 TFormMain::TimerRequestTimer(TObject *Sender)
    if (ccm->GetResult((TBufferCast *)&Result)>0)
	{
           ...zapis dannich 
         _di_ITask task = TTask::Create(_di_TProc(new TCppTask(Result))); 
           task->Start();//zdes po idee idet pokaz v otdelnom taske
         
           ... rascheti dannich     

   if (Reactivate) { TimerRequest->Enabled = true;..//timer krutitsja poka ne ostanovjat 
          }

////////////////////////////////////////////////////////////////////////////////////////



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

Как быть и что делать ?
с ув Виктор !
П.С. пытался определить в разных местах статуци типа

Код: plaintext
1.
if (task->Status == TTaskStatus::Completed) 



но при "Sleep ( mnogo dannich 8000)" не помогает. Таймер перестартовывает раньше.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462168
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

Ну я, честно говоря, ничего не понял.
Понятно, что нужно правильно распараллелить расчёт и показ графиков, но как это делать -- зависит от задачи,
я лично из твоих объяснений не понял пока ничего собственно о задаче.

Если какие-то мифические TTask-и тебе непонятны, попробуй воспользоваться стандартными <future> из С++ (11).
Они достаточно просты для понимания и не требуют никаких классов и иерархий. Если их сопрячь с лямбдами,
будет ещё проще.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462171
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и таймеры для многозадачного программирования не применяются. Забудь про них пока не поймёшь , зачем они.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462181
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Видимо первое обьяснение было сумбурным. В виду необходимости решения этой задачи я создал топик в делфях. мне там ответили но не помогло. я могу сделать копию обьяснения могу скинуть ссылку а могу есче раз обьяснить попробовать.Как правильней?
на всякий случай ссылка.
http://www.sql.ru/forum/1261481/parallel-programming-library-ttask-timer
надеюсь на помощь.:)
с ув Виктор !
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462203
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

ну не я это начинал мне этот г...р от коллеги достался. Жесткая задача. Не меняй а усовершенствуй.
Работает таймер . читает пишет показывает. Задача разделить процессы внутри таймера чтоб рисовалка диаграмм работала сама по себе и не тормозила запись данных. Отрисовка работает себе по тихоньку пока не закончит не обращая внимания на работу таймера. Но по завершении рисования опять в таймере получает новую порцию данных для рисования. вопро стоит нового рисования пока не закончилось старое.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462216
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Запускаем отдельную нитку Б подготовки данных.
- в главном потоке на форме рисуем Waiting или песочные часы на предыдущем графике

2. По завершению Б выставляем флаг/condition var
что то вроде http://en.cppreference.com/w/cpp/thread/notify_all_at_thread_exit
-в главном потоке отдаем графику новые данные

Вариант - если обновление регулярное - то Б не завершаем, а через флаг готовности / мутекс _копируем_ готовую пачку данных основному потоку

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

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

ну не я это начинал мне этот г...р от коллеги достался. Жесткая задача. Не меняй а усовершенствуй.
Работает таймер . читает пишет показывает. Задача разделить процессы внутри таймера чтоб рисовалка диаграмм работала сама по себе и не тормозила запись данных. Отрисовка работает себе по тихоньку пока не закончит не обращая внимания на работу таймера. Но по завершении рисования опять в таймере получает новую порцию данных для рисования. вопро стоит нового рисования пока не закончилось старое.
Оберни код мутексом и при запуске проверяй: если занят, то значит еще работает предыдущий запуск и ничего делать не надо.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462237
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,
дак а я за что? Я ТОЛЬКО ЗА. только нету у таска мьютекса.или я не нашел:)
Вот набросал схемку. Да. работа таймера непрерывна. а показывать и без песочных часов можно. Получил. Показал.
Как мне в таске впихнуть этот флаг готовности ?
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462245
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Дима как? код вверху где что записать ?

есть класс передаю данные через конструктор в таймере при создании обьекта. все. мне нужно только проверку окончания таска.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462247
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikтолько нету у таска мьютекса.или я не нашел:)
Мутекс сам по себе. Хоть WinAPI используй.
Глобальную переменную объяви в конце-концов.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462257
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

код я в форуме делфи выложил. ссылка выше. не хочу мусорить в форуме.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462260
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikDima T,

Дима как? код вверху где что записать ?

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

Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
std::mutex mtx;
//////////////////////////////////////////////////////////////////////////////////////
 class TCppTask : public TCppInterfacedObject<TProc>
  {
  public:
  TBuffer CCMResult;

  int ii;  

  TCppTask(TBuffer CCMResult )
  {
	ii = CCMResult.Rpm ;
  }
  void __fastcall Invoke()
	{
		mtx.lock();
		String s=  IntToStr(ii);
		FormMain->Label_RPM->Caption =  s ;	
тут вывод картинки

       //        Sleep(1000); // это лишнее
       //  vmesto sleep podstavljaem mnogestvo parametrov neobhodimich dlja pokaza
	// parametrov och mnogo odin iz nich 7000 tochek na TChart.
	}
		mtx.unlock();
};
//////////////////////////////////////////////////////////////////////////////////////////
 TFormMain::TimerRequestTimer(TObject *Sender)
    if (ccm->GetResult((TBufferCast *)&Result)>0)
	{
		mtx.lock();
           ...zapis dannich 
		mtx.unlock();
        _di_ITask task = TTask::Create(_di_TProc(new TCppTask(Result))); 
           task->Start();//zdes po idee idet pokaz v otdelnom taske
         
           ... rascheti dannich     

   if (Reactivate) { TimerRequest->Enabled = true;..//timer krutitsja poka ne ostanovjat 
          }

////////////////////////////////////////////////////////////////////////////////////////


PS Если std::mutex будешь использовать, то для него есть std::unique_lock
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462261
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvik,

другими словами как главному тайму(программе) узнать что таск закончил работу чтобы запустить таск заново. Естественно автоматически и внутри таймера с передачей данных через коструктор
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462267
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

немножечко не так. при работе таймера я создаю обьект таска. и пока он не закончит работу. я не создаю новый таск. Вопрос как узнать окончание работы таска?
если таймер не узнает что таск есче работает он создает новый таск пока не заполнит память.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462270
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikDima T,

немножечко не так. при работе таймера я создаю обьект таска. и пока он не закончит работу. я не создаю новый таск. Вопрос как узнать окончание работы таска?
если таймер не узнает что таск есче работает он создает новый таск пока не заполнит память.
Он не создаст новый таск пока старый не отработает. Ты мутексами пользовался когда-нибудь?
Если один поток захватил мутекс (mtx.lock()) то второй поток повиснет на mtx.lock() до тех пор пока первый не вызовет mtx.unlock()
т.е. пока первый таск работает - твой код будет висеть пока таск не отработает

Если висеть не надо, то можно проверить блокировку
Код: plaintext
1.
2.
3.
4.
5.
6.
if(!mtx.try_lock()) {
   ... еще работает 
   return;
}
...
mtx.unlock();
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю "Parallel Programming Library" это дельфийный С++. Если так то лучше в дельфи спросить как этими тасками пользоваться, т.к. это не С++, а самостоятельная либа, которую в С++ мало кто использует.

Вот нагуглил :
авторTTask – это класс, который позволяет запускать одну задачу или несколько задач параллельно. При этом вам не придётся создавать поток и управлять им. Класс TTask реализует интерфейс ITask. В интерфейсе ITask в вашем распоряжении есть функции для запуска (Start), ожидания (Wait) и отмены (Cancel) задачи и статус (Status), позволяющий узнать, что происходит с задачей. Вот возможные статусы задачи: Created (задача создана), WaitingToRun (задача ожидает окончания выполнения другого процесса), Running (задача выполняется), Completed (задача завершена), WaitingForChildren (задача ожидает окончания выполнения дочерней задачи), Canceled (задача была отменена), Exception (при выполнении задачи произошла ошибка).
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462283
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

мютексами не пользовался думаю ничего военного. останавливать и ждать нельзя. просто таймер молотит свою работу и по освобождению таска выдает ему новое задание. все. Я немогу узнать окончание работы таска!

не надо никого блокировать. все работает без ожиданий.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462292
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

вот я и мыкаюсь в поисках спецов конкретики а получаю обобщенные советы подумать на тему а не использовать ли опен джиэль в тчарте. Я без претензий:) мне бы хелп получить.
с ув Виктор !
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462321
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikDima T,

проблемма в том что инфы оч мало. в делфях тоже все подвисают никакой конкретики. общие фразы.
то что ты.вы. нашли(шел) я не знаю как правильней:) я уже давно как сон вижу. в эмбаркадеро три кастрированных примерчика которые на примитивном уровне обьясняют . А дальше сам...
Документация на это поделие (TTask, Timer) есть в инете хоть какая-нибудь? Если есть - давай ссылки.

Распараллеливание - это достаточно сложная тема с кучей граблей. По-хорошему надо начинать с этой книги Джеффри Рихтер Создание эффективных Win32-приложений

PS Правильно "ты"
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462339
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikDima T,

мютексами не пользовался думаю ничего военного. останавливать и ждать нельзя. просто таймер молотит свою работу и по освобождению таска выдает ему новое задание. все. Я немогу узнать окончание работы таска!

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

Как вариант: запускать таймер таском, т.е. при срабатывании таймера останавливаешь таймер, подготавливаешь таск, запускаешь, в конце работы таска высчитываешь сколько времени осталось до следующей сработки, ставишь на это время таймер, запускаешь таймер и так по кругу.

Можно проще: вместо таймера просто собственное виндовое сообщение, по которому происходит подготовка исходных данных, а в таске в конце Sleep() на время до следующей сработки и отправка сообщения.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462415
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Распараллеливание - это достаточно сложная тема с кучей граблей. По-хорошему надо начинать с этой книги Джеффри Рихтер Создание эффективных Win32-приложений только там о тасках нет ничего.:(

настольная книга в пдэфе. таймер не останавливается!!!!! Я могу облокотится на время работы таска. Но таймер должен работать без остановов локов ожиданий итд.
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462424
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462435
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komvikтолько там о тасках нет ничего.:(
Там об устройстве виндовса и WinAPI, на котором таски и таймеры работают. И о подводных камнях многопоточных приложений.

Похожим образом устроены таски в C#, можешь про них почитать у того же Рихтера Глава 27. асинхронные вычислительные операции

komvikНо таймер должен работать без остановов локов ожиданий итд.
Мой пост выше читал 20523566 ?
...
Рейтинг: 0 / 0
Parallel Programming Library TTask+Timer (c++)
    #39462453
komvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Как вариант: запускать таймер таском, т.е. при срабатывании таймера останавливаешь таймер, подготавливаешь таск, запускаешь, в конце работы таска высчитываешь сколько времени осталось до следующей сработки, ставишь на это время таймер, запускаешь таймер и так по кругу.


таск создается в РАБОТАЮЩЕМ БЕЗ ОСТАНОВКИ таймере И живет своееей жизнью.
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Parallel Programming Library TTask+Timer (c++)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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