|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.06.2010, 19:29 | #1 |
Регистрация: 30.05.2010
Сообщений: 9
|
Многопоточность - класс BackgroundWorker
Добрый всем день.
Вот часть кода программы для работы с COM портом (Visual Syudio C++ 2008). Использую структуру для работы с COM портом (правда еще не дописана). Я создаю в начале формы экземпляр структуры (com). Далее, в основном потоке я вызываю для созданного экземпляра функцию SetupComPortVS("COM1"), тем самым открывая порт. Далее мне нужно запустить фоновый поток для чтения, и я внутри обработчика DoWork "для созданного экземпляра" вызываю функцию чтения порта ReadComPortVS() (все функции внутри структуры). Все работает и все как бы хорошо. Вопрос такой (сам разобраться не смог) : После того как это заработало, я прочитал что обращение к элементам формы должно происходить в основном !!! потоке, и что объекты, входящие в какой - либо апартамент, могут быть вызваны только потоком этого !!! апартамента. То есть у меня все неправильно, но работает. Можно ли оставить код в таком виде или все же следует его переписывать так, чтобы код фонового потока не имел общего экземпляра с основным потоком ? Заранее благодарен. |
21.06.2010, 19:56 | #2 | |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 525
|
Цитата:
переделать чтоб было правильно довольно легко - у каждого контрола если метод Invoke или BeginInvoke который прининмает делегат и выполняет его в "правильном" потоке.. если этот объект com используется(активно) где-то еще кроме потока можно добавить синхронизацию с помощью lock но если программка маленькая проще оставить все как есть.. |
|
21.06.2010, 20:09 | #3 |
Регистрация: 30.05.2010
Сообщений: 9
|
То есть я так понимаю, нужно просто следить за тем, чтобы не было
случайного одновременного вызова данного метода ? Спасибо, все понял. Последний раз редактировалось SerzhVl; 21.06.2010 в 21:22. |
22.06.2010, 22:41 | #4 |
Регистрация: 30.05.2010
Сообщений: 9
|
Извините, осталась одна неясность. С контролами я разобрался, но
экземпляр структуры STRTComPort ? Он глобальный, значит вероятно, я полагаю, он не принадлежит никакому потоку. Разные потоки вызывают его методы, а методы в результате инициализируют поля структуры (смысл структуры - собрать в себе все, что относиться к порту). Скажите, принадлежит ли объявленный глобальный экземпляр структуры какому - либо потоку конкретно ? Заранее благодарен. |
24.06.2010, 01:47 | #5 |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 525
|
конечно, он принадлежит основному потоку
по-хорошему вообще всегда надо синхронизацию делать, просто если нет знаний по этой теме, но хочется написать програмку для себя/препода то можно схалтурить..но это не правильно и не надежно |
25.06.2010, 19:34 | #6 |
Регистрация: 30.05.2010
Сообщений: 9
|
Спасибо. Знаний действительно маловато, но уж очень хочется хотя бы небольшие программки писать, но полезные. Пока только для себя. Насчет синхронизации, да действительно можно проворонить. Вроде в структуре все нормально, функция чтения порта - в фоновом потоке, функция записи - в основном. Они работают и вроде все нормально... Но о результатах окончания своей работы они сообщают одной и той же переменной (true, false). Вот и проворонил... В общем понятно, еще раз спасибо.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
BackgroundWorker, сообщение о прогрессе выполнения операции | Casper-SC | Общие вопросы .NET | 2 | 28.05.2010 20:02 |
Многопоточность | CrazyDude | Общие вопросы Delphi | 1 | 18.04.2010 19:00 |
Многопоточность | JakSon | Общие вопросы Delphi | 10 | 27.12.2009 02:19 |
Где можно найти много примеров по потокам и особенно по компоненту backgroundworker? | Neymexa | Общие вопросы .NET | 1 | 16.05.2009 03:34 |
backgroundworker | Neymexa | Общие вопросы .NET | 3 | 06.05.2009 17:13 |