Обработка данных и отрисовка в разных потоках
От: alx7235  
Дата: 12.12.10 12:00
Оценка:
Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?

01.01.11 14:40: Перенесено модератором из 'C/C++. Прикладные вопросы' — Odi$$ey
Re: Обработка данных и отрисовка в разных потоках
От: nullptr_t  
Дата: 12.12.10 12:09
Оценка: +1
Здравствуйте, alx7235, Вы писали:

ну ставь данные в очередь, сигналь гуевому потоку, что они появились, и он пусть рисует и очищает очередь. в чем проблема? о_О
Re[2]: Обработка данных и отрисовка в разных потоках
От: alx7235  
Дата: 12.12.10 13:23
Оценка:
Здравствуйте, nullptr_t, Вы писали:

_>Здравствуйте, alx7235, Вы писали:


_>ну ставь данные в очередь, сигналь гуевому потоку, что они появились, и он пусть рисует и очищает очередь. в чем проблема? о_О

nullptr_t, спасибо. А как просигналить потоку и очистить очередь, можно пару строчек для примера, в какой функции главного потока запускать отрисовку?
Re[3]: Обработка данных и отрисовка в разных потоках
От: nullptr_t  
Дата: 12.12.10 13:46
Оценка:
Здравствуйте, alx7235, Вы писали:

A>А как


очень просто. берешь что-нибудь вроде std::queue, критическую секцию, запускаешь поток, который вертится и принимает данные из порта. когда в него поступают данные: входишь в секцию, отправляешь сигнал (например, окну гуевого потока асинхронно сообщение WM_USER + 1234), заносишь данные, выходишь из секции. когда приходит сигнал в гуевый поток: входишь в секцию, забираешь данные, удаляешь те данные которые забрал, выходишь из секции, рисуешь. всё

самый просто пример. все тонкости его реализации уже на твоей совести
Re[4]: Обработка данных и отрисовка в разных потоках
От: Аноним  
Дата: 12.12.10 14:36
Оценка:
Здравствуйте, nullptr_t, Вы писали:

_>Здравствуйте, alx7235, Вы писали:


A>>А как


_>очень просто. берешь что-нибудь вроде std::queue, критическую секцию, запускаешь поток, который вертится и принимает данные из порта. когда в него поступают данные: входишь в секцию, отправляешь сигнал (например, окну гуевого потока асинхронно сообщение WM_USER + 1234), заносишь данные, выходишь из секции. когда приходит сигнал в гуевый поток: входишь в секцию, забираешь данные, удаляешь те данные которые забрал, выходишь из секции, рисуешь. всё


_>самый просто пример. все тонкости его реализации уже на твоей совести

а что такое std::queue? Можно ли попроще без крит. секций сделать? Например, сделать глобальный массив, в который писать данные, а потом просто сигналить что они пришли, ждать с помощью waitforsingleobject? У меня проблема — не знаю как с гуевым потоком работать, т.е. у меня есть функция FormCreate, в ней создаю поток CreateThread для чтения с com-порта, не пойму как создать ожидание на отрисовку в гуевом потоке? Уж очень не хочется с крит. секциями разбираться.
Re[5]: Обработка данных и отрисовка в разных потоках
От: nullptr_t  
Дата: 12.12.10 15:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а что такое std::queue? Можно ли попроще без крит. секций сделать? Например, сделать глобальный массив, в который писать данные, а потом просто сигналить что они пришли, ждать с помощью waitforsingleobject? У меня проблема — не знаю как с гуевым потоком работать, т.е. у меня есть функция FormCreate, в ней создаю поток CreateThread для чтения с com-порта, не пойму как создать ожидание на отрисовку в гуевом потоке? Уж очень не хочется с крит. секциями разбираться.


o_О эм... как можно уметь читать из com-порта и не знать что такое крит. секция, синхронизация объектов, std::queue?

если нужна синхронность: SendMessage с данными из потока порта в окно, сохраняем данные из wParam, lParam; продолжаем работу потока порта, вызвав ReplyMessage(TRUE) до или после отрисовки данных. всё
Re: Обработка данных и отрисовка в разных потоках
От: WiseAlex Беларусь  
Дата: 12.12.10 19:00
Оценка:
Здравствуйте, alx7235, Вы писали:

A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation.

что-то мне кажется что access violation не из-за одного потока а из-за некорректной логики в твоем приложении...
Re[4]: Обработка данных и отрисовка в разных потоках
От: std.denis Россия  
Дата: 12.12.10 23:03
Оценка:
np_t>входишь в секцию, отправляешь сигнал (например, окну гуевого потока асинхронно сообщение WM_USER + 1234), заносишь данные, выходишь из секции.
зачем отправлять сигнал до внесения данных (и, соответственно, отпускания секции)?
Re[5]: Обработка данных и отрисовка в разных потоках
От: nullptr_t  
Дата: 13.12.10 07:34
Оценка:
Здравствуйте, std.denis, Вы писали:

SD>зачем отправлять сигнал до внесения данных

а вдруг данные 1ms задвигаются? а тут уже поток готов зохавать и переварить. а отправлять после выхода из секции это только трата времени
Re: Обработка данных и отрисовка в разных потоках
От: quodum  
Дата: 13.12.10 08:50
Оценка:
Здравствуйте, alx7235, Вы писали:

A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?


Сначала разберись с access violation. В однопоточном варианте это сделать гораздо проще, чем в многопоточном.
Re[2]: Обработка данных и отрисовка в разных потоках
От: Mr.Delphist  
Дата: 15.12.10 09:58
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>Здравствуйте, alx7235, Вы писали:


A>>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation.

WA>что-то мне кажется что access violation не из-за одного потока а из-за некорректной логики в твоем приложении...
Как раз таки от потока. Дело в том, что VCL-библиотека (откуда и происходит TChart) является однопоточной (опять же следствие свойств Win32 API, помноженное на собственные ньюансы VCL). Попытка работать с VCL-объектами (особенно графическими) из невизуального потока часто приводит к ошибкам "Access Violation", "Canvas does not allow drawing" и прочее.
Re: Обработка данных и отрисовка в разных потоках
От: Ops Россия  
Дата: 24.12.10 19:17
Оценка: +1
Здравствуйте, alx7235, Вы писали:

A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?


Если используешь TThread: Выделяешь все, что работает с GUI в отдельную/ные функцию/и-член/ы, сигнатуру не помню, в хелпе легко находится. Для вызова функции пишешь Synchronyze(func); — она будет выполнена в контексте главного потока.

Если используешь другие классы/функции для реализации многопоточности — милости просим в другие фреймворки или в WINAPI.

ЗЫ. Документация билдера на высоте:"typedef TThreadMethod TThreadMethod;" ms-help://embarcadero.rs2010/vcl/Classes.TThreadMethod.html
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.