Здравствуйте, alx7235, Вы писали:
A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?
Если используешь TThread: Выделяешь все, что работает с GUI в отдельную/ные функцию/и-член/ы, сигнатуру не помню, в хелпе легко находится. Для вызова функции пишешь Synchronyze(func); — она будет выполнена в контексте главного потока.
Если используешь другие классы/функции для реализации многопоточности — милости просим в другие фреймворки или в WINAPI.
Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?
01.01.11 14:40: Перенесено модератором из 'C/C++. Прикладные вопросы' — Odi$$ey
Re[2]: Обработка данных и отрисовка в разных потоках
Здравствуйте, nullptr_t, Вы писали:
_>Здравствуйте, alx7235, Вы писали:
_>ну ставь данные в очередь, сигналь гуевому потоку, что они появились, и он пусть рисует и очищает очередь. в чем проблема? о_О
nullptr_t, спасибо. А как просигналить потоку и очистить очередь, можно пару строчек для примера, в какой функции главного потока запускать отрисовку?
Re[3]: Обработка данных и отрисовка в разных потоках
очень просто. берешь что-нибудь вроде 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]: Обработка данных и отрисовка в разных потоках
Здравствуйте, Аноним, Вы писали:
А>а что такое std::queue? Можно ли попроще без крит. секций сделать? Например, сделать глобальный массив, в который писать данные, а потом просто сигналить что они пришли, ждать с помощью waitforsingleobject? У меня проблема — не знаю как с гуевым потоком работать, т.е. у меня есть функция FormCreate, в ней создаю поток CreateThread для чтения с com-порта, не пойму как создать ожидание на отрисовку в гуевом потоке? Уж очень не хочется с крит. секциями разбираться.
o_О эм... как можно уметь читать из com-порта и не знать что такое крит. секция, синхронизация объектов, std::queue?
если нужна синхронность: SendMessage с данными из потока порта в окно, сохраняем данные из wParam, lParam; продолжаем работу потока порта, вызвав ReplyMessage(TRUE) до или после отрисовки данных. всё
Здравствуйте, alx7235, Вы писали:
A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation.
что-то мне кажется что access violation не из-за одного потока а из-за некорректной логики в твоем приложении...
Re[4]: Обработка данных и отрисовка в разных потоках
np_t>входишь в секцию, отправляешь сигнал (например, окну гуевого потока асинхронно сообщение WM_USER + 1234), заносишь данные, выходишь из секции.
зачем отправлять сигнал до внесения данных (и, соответственно, отпускания секции)?
Re[5]: Обработка данных и отрисовка в разных потоках
Здравствуйте, std.denis, Вы писали:
SD>зачем отправлять сигнал до внесения данных
а вдруг данные 1ms задвигаются? а тут уже поток готов зохавать и переварить. а отправлять после выхода из секции это только трата времени
Здравствуйте, alx7235, Вы писали:
A>Привет! Пишу в C++ Builder. Имею два потока — один принимает данные от com-порта, другой должен отрисовывать их в TChart-е. Сначала делал просто, создал поток приема данных и в нем же рисую, но иногда возникает ошибка access violation. Как понимаю нужно два потока, один создаю, а другой уже есть который создается при создании приложения и нужно их синхронизировать. Как бы сделать, чтобы все грамотно работало?
Сначала разберись с access violation. В однопоточном варианте это сделать гораздо проще, чем в многопоточном.
Re[2]: Обработка данных и отрисовка в разных потоках
Здравствуйте, 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" и прочее.