|
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 45
|
|
Отрисовка потоком в Canvas05.07.2016, 20:53. Показов 2628. Ответов 23
Метки нет (Все метки)
Доброго времени суток. В общем ситуация такова: есть таймер, работающий с точностью в 10мс в отдельном потоке. В зависимости от времени, на канве рисуются графики и куча другого динамического интерфейса. В программе есть два режима работы: непрерывный и дискретный. Дискретный заканчивает отрисовку каждые 1570 мс, после чего пользователь должен нажать кнопку "продолжить" и работа таймера и отрисовки возобновляется. Однако, я столкнулся с рядом проблем.
В общем если рисовать на канве в отдельном потоке, то интерфейс начинает сильно глючить. Приходится ставить задержку в 10мс, но тут проявляется другая проблема, которая заключается в плохой синхронизации. Иногда программа не успевает отловить нужное значение времени в потоке, и в дискретном режиме работы отрисовка не прекращается. Есть какие-нибудь идеи или советы по решению данной проблемы? Понимаю, что работа с интерфейсом должна происходить в основном потоке, но отрисовка циклами заставляет программу зависать намертво, а использование TTimer не обеспечивает нужную точность в 10мс. З.ы. Использую C++ Builder XE
0
|
|
| 05.07.2016, 20:53 | |
|
Ответы с готовыми решениями:
23
Отрисовка на Canvas "гладкой" наклонной линии Отрисовка линии на canvas
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 05.07.2016, 21:14 | |
|
Отрисовка из отдельного потока осуществляется с синхронизацией с основным потоком?
0
|
|
|
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 45
|
||||||
| 05.07.2016, 22:23 [ТС] | ||||||
|
d7d1c, да.
0
|
||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 06.07.2016, 08:08 | |
|
Честно сказать, не очень понятно ваше описание проблемы. Вы пишете, что есть таймер с точность 10 мс в отдельном потоке. Потом Вы пишете, что приходится добавлять задержку в 10 мс. В приведенном коде я вижу только одну задержку в 10 мс...
Вы пробовали для тестирования как-то упростить Ваш код? Например, выводить из потока какой-нибудь один элемент графики, а не "кучу другого динамического интерфейса"?
0
|
|
|
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 45
|
||||||
| 06.07.2016, 09:20 [ТС] | ||||||
|
d7d1c, в общем существует 3 потока. Это основной поток, поток для отрисовки и поток таймера. Таймер я реализовал следующим образом:
Мне вот что интересно. Даже если абстрагироваться именно от моей проблемы, как можно рисовать на канве сложные изображения (с множеством линий, прямоугольников, эллипсов и т.д.) с высокой скоростью (т.е. по факту при работе с таймером, что я привёл выше), и при этом чтобы программа могла успевать улавливать нужные значения таймера, и скажем, прекращать отрисовку каждые 5 секунд?
0
|
||||||
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|
| 06.07.2016, 10:10 | |
|
Rex_, зачем вам рисовать по таймеру? у вас какие-то "шевелящиеся" элементы интерфейса?
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 06.07.2016, 10:28 | ||
![]() Каким образом Вы осуществляете остановку отрисовки. Выполняете для потока функцию Terminate?
1
|
||
|
1 / 1 / 0
Регистрация: 24.02.2014
Сообщений: 45
|
||||||
| 06.07.2016, 11:37 [ТС] | ||||||
|
vxg, да, и их очень много. По сути, программа предназначена для моделирования физ. процессов в реальном времени.
d7d1c, да, Terminate естественно используется. Я тут задумался о том, как эффективно отлавливать нужные значения таймера и понял, что лучше это делать в самом таймере ![]()
0
|
||||||
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|
| 06.07.2016, 12:07 | |
|
Rex_, возможно чем-то поможет https://www.cyberforum.ru/com-... ost9058429 там тоже есть поток который дергает перерисовку - правда он зависимый от событий но вы можете это поведение упразднить и просто вставить Sleep
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 06.07.2016, 12:55 | ||
|
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 06.07.2016, 14:33 | ||
|
0
|
||
|
Супер-модератор
|
|
| 06.07.2016, 14:41 | |
|
Еще раз повторить? Потому что
состояние компонента не изменится при чтении свойства. При этом компонент не перерисовывается, не лочит какие-то участки памяти. Ничего не делается, кроме чтения значения из памяти. Почему должен быть AV, можешь объяснить? Единственное, что может произойти плохого - так это чтение уже устаревшего значения через свойство, если в тот же момент времени, как ты будешь читать, кто-то другой возьмет и запишет туда (с синхронизацией, как положено) другое значение.
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 06.07.2016, 15:00 | |
|
Сейчас уже не вспомню где, но когда читал про потоки, то было написано, что обращение к VCL компонентам из потока должно происходить через синхронизацию с основным потоком. Именно обращение, то есть и чтение и запись. Как было сказано, синхронизация необходима для того, чтобы к одной переменной одновременно не обратилось два потока.
Уважаемый volvo, тогда объясните, почему изменение значений свойств VCL из потока должно происходить через синхронизацию? Почему без нее возникает AV?
0
|
|
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
||
| 06.07.2016, 15:03 | ||
|
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 06.07.2016, 15:07 | |
|
0
|
|
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
||
| 06.07.2016, 15:13 | ||
|
0
|
||
|
Супер-модератор
|
|||
| 06.07.2016, 15:22 | |||
|
0
|
|||
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|||
| 06.07.2016, 15:41 | |||
|
я этот пример приводил как объяснение как можно поймать AV при чтении без синхронизации в ответ на
0
|
|||
| 06.07.2016, 15:41 | |
|
Помогаю со студенческими работами здесь
20
Отрисовка сложных фигур на canvas
Отрисовка на Canvas при использовании MVVM Canvas.TextOut отрисовка текста относительно центра Работа с timage.canvas, отрисовка нескольких картинок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|