![]() |
|
Модераторы: bsa |
![]()
|
|
| ГЫнок |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 20.3.2009 Репутация: нет Всего: нет |
Здравствуйте!
История такая: Взял МК и зашил в него програму, которая по виртуальному ком порту передает резальтаты сканирования АЦП при этом используется 4 байта из всего буфера, в данном случае получается скорость 4 кбайт/сек. На ПК эти данные получаю и рисую 2 графика, при этом использую 1 поток... Возникле 3 проблемы: 1. Когда кривая доходит до конца графика, я естественно отправляю ее вначало и обновляю фон чтоб линии не накладывались if (ci>=500) {ci=10; Fon();}, но вот беда программа выресовывает только до первого обновления графика а далее из ком порта читаются только нули... программу закрывает открываешь и все повторяется. 2. Попробовал закоментировать обновление графикая if (ci>=500) {ci=10; /*Fon();*/}, данные считываются нормально но линии накладываются друг на друга и получается каша... 3. Через некоторое время происходт странности один из Image'в прост пропадает и не появляется а бывает оба пропадают Пробовал сохранять данные из ком в буфер и ресовать график не в потоке а по таймеру 10 раз в сек, но получется некрасива и график себя странно ведет.... Но нет глюков как в потоке... Ничего не понимаю
З.Ы. Заранее спосибо! |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Вообще-то VCL не многопоточная. Надо синхронизировать при обращении к ее функциям из другого потока.
|
|||
|
||||
| ГЫнок |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 20.3.2009 Репутация: нет Всего: нет |
Звучит зловещи...
Кто-то мне посоветовал все данные отправлять в файл а потом считать оттуда, это конечно вариант но необходимо все видеть в реальном времени... Я сделал вывод что предется развивать тему с рисованием графика по таймеру учитывая что это заработало хоть и криво по началу... Можетели еще варианты предложить чтоб было из чего выбирать? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Вариантов тут немного.
Основной поток - считывает данные из порта, дополнительный их рисует. Или наоборот - дополнительный считывает, основной рисует. Особо зловещего ничего нет. Просто в вашем варианте мне трудно оценить количество срабатываний - т.е. успеет ли график отрисоваться при использовании синхронизации. Исходя из описания проблемы мне видится следующая причина: Закраска фона достаточно длительная процедура. Когда ваш график полностью завершился происходит перерисовка фона. Пока она еще не закончилась вызывается метод рисования. Получаем повторный вход в нереентерабельную VCL и, соответственно глюк. Попробуйте все обращения к VCL из потока оформить через Synchronize. |
|||
|
||||
| ГЫнок |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 20.3.2009 Репутация: нет Всего: нет |
Ясна...
Если известно что в секунду передается 1000 пакетов, т.е. цикл в потоке чтения повторяется 1000 раз в сек. Эта информация может помоч в этом не легком деле? Вопрос по поводу Synchronize, так вроде ее нужно применять при использование потока TThread, а с функциями WinApi в ней нет необходимости... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Упс, невнимательно посмотрел. Вообще-то я всегда считал, что смешивать потоки WinAPI и VCL не стоит. 1000 раз в секунду это много. График реально обновляться должен намного реже - 25 раз в секунду - это уже обычное видео. Для графика достаточно и одного раза в секунду. Раз уж визуализацию делаете средствами VCL - то попробуйте использовать TThread. Хотя разницы большой я не вижу - VCL не многопоточна, значит нереентерабельна. И каким образом в нее поступают вызовы мне кажется безразлично. Я ни разу не использовал потоки, созданные через WinAPI с VCL - либо то либо другое. Но TThread скорее всего обертка, поэтому синхронизация нужна по-любому. ИМХО. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
В любом случае частота 1000 Герц для обновления не нужна.
Вижу два подхода: 1. Менять прошивку контроллера. Если программа контроллера будет сама обрабатывать статистику и пересылать ее пару раз в секунду на комп этого за глаза хватит, чтобы насладится графиком. 2. Основной поток чтения из порта должен быть занят только одним: считать данные и сохранить их для последующего анализа. Вызывать из него методы отображения не нужно - он должен только обновлять некий глобальный объект статистики (через методы синхронизации). А вот основной поток должен раз-два в секунду брать обновленную статистику и отображать ее в графике. Таким образом чтение из порта отделим от медленной процедуры отрисовки. Не успел отрисоваться - не беда, зато данные приняты все - их потом можно внимательно изучить. На мой взгляд 2-й подход правильней. Лично я использовал его. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |