Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [вопрос] Builder, COM порты, графика и потоки


Автор: gather 6.5.2008, 07:55
Возник следующий вопрос.
1) Имеется картинка в формате BMP 8bpp (размеры 8200x8300/70МБ)
2) Имеется COM порт, с которого надо читать поток данных, который туда передает приемник.
3) Имеется основная программа, которая должна выполнять п. 1 и 2 и отрисовывать заданный участок исходного BMP на канве.

Все бы хорошо, но хотелось бы уточнить некоторые детали.

1) Как лучше организовать работу с COM портом и передачу полученных данных в обработчик?
2) Как лучше организовать вывод области BMP на канву?
Если необходимо использовать потоки, то каким образом лучше разделить их? Свой поток для COM порта и отрисовки карты, либо раздельные?

Заранее спасибо за помощь.


Автор: ama_kid 6.5.2008, 08:10
Цитата(gather @  6.5.2008,  07:55 Найти цитируемый пост)
Как лучше организовать работу с COM портом и передачу полученных данных в обработчик?
Как угодно, но в любом случае на эту работу должно быть выделено не менее одного потока (как правило - одного достаточно). Поток крутится, постоянно считывает данные с порта и сообщениями (либо другим безопасным способом) передает принятые данные в основной поток (на форму).
Цитата(gather @  6.5.2008,  07:55 Найти цитируемый пост)
Как лучше организовать вывод области BMP на канву?
Имхо, конечно, но мне почему-то кажется, что лучше такой большой рисунок разбить на кучу мелких, ибо одномоментно выводить 700мб картинки будет затруднительно и нерационально. А по мере необходимости - подгружать требуемый участок. Отдельный поток на это дело вроде как не требуется (хотя можно и обдумать в плане буферизации рисунков).

Автор: gather 6.5.2008, 08:34
ama_kid, 
Цитата(ama_kid @  6.5.2008,  08:10 Найти цитируемый пост)
ибо одномоментно выводить 700мб 
 ноликом ошиблись smile там 70 метров.


Цитата(ama_kid @  6.5.2008,  08:10 Найти цитируемый пост)
и сообщениями (либо другим безопасным способом) передает принятые данные в основной поток (на форму).

а можно пример, как это реализовать?  smile 

Автор: ama_kid 6.5.2008, 08:56
Цитата(gather @  6.5.2008,  08:34 Найти цитируемый пост)
ноликом ошиблись  smile там 70 метров.
Ну, 70 метров тоже не сильно увеличат производительность... smile 
Цитата(gather @  6.5.2008,  08:34 Найти цитируемый пост)
а можно пример
Не понял, какой пример? Заводишь у себя на форме собственное сообщение WM_USER+xxx и функцией SendMessage передаешь данные через это сообщение. Либо, если данных много - используешь сообщение WM_COPYDATA. Либо, если не хочешь юзать сообщения - через Synchronize\критические секции напрямую копируешь данные в основной поток. Вариантов много...

Автор: gather 6.5.2008, 09:02
Цитата(ama_kid @  6.5.2008,  08:56 Найти цитируемый пост)
Не понял, какой пример?

В принципе, то что Вы сказали и требовалось smile Спасибо за помощь.

Цитата(ama_kid @  6.5.2008,  08:56 Найти цитируемый пост)
Ну, 70 метров тоже не сильно увеличат производительность... smile 

Она один раз подгружается, потом из нее требуемые части 300*300 пикселей отображаются smile

Автор: fish9370 6.5.2008, 12:44
писал абсолютно похожую программу..
выглядела она примерно так: поток для приема данных, поток для отрисовки состояния, и поток основной программы (интерфейс пользователя)
проблемы с которыми столкнулся: рассинхронизация потоков (абсолютно необъяснимые крэши, в случайный момент времени от 15 минут до 8 часов), здесь мне кажется действительно удобным взаимодействие с помощью системных сообщений..
отображение производил в потоке с частотой 100мс через двойной буфер с помощью системной API-функции BitBlt() никаких задержек или проблем с этим не наблюдал..

ps в windows для работы с ком-поротом (и не только) предусмотренна API-функция CreateFile(), результатом которой является handle устройства, дальше используются функции для работы с файлами, куда этот handle должен быть передан..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)