Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2010, 19:29   #1
SerzhVl
 
Регистрация: 30.05.2010
Сообщений: 9
По умолчанию Многопоточность - класс BackgroundWorker

Добрый всем день.

Вот часть кода программы для работы с COM портом
(Visual Syudio C++ 2008).

Использую структуру для работы с COM портом (правда еще не дописана).

Я создаю в начале формы экземпляр структуры (com).
Далее, в основном потоке я вызываю для созданного экземпляра функцию SetupComPortVS("COM1"), тем самым открывая порт.

Далее мне нужно запустить фоновый поток для чтения, и я внутри обработчика DoWork "для созданного экземпляра" вызываю функцию чтения порта ReadComPortVS() (все функции внутри структуры).

Все работает и все как бы хорошо.

Вопрос такой (сам разобраться не смог) :

После того как это заработало, я прочитал что обращение к элементам формы должно происходить в основном !!! потоке, и что объекты, входящие в какой - либо апартамент, могут быть вызваны только потоком этого !!! апартамента.

То есть у меня все неправильно, но работает.

Можно ли оставить код в таком виде или все же следует его переписывать так, чтобы код фонового потока не имел общего экземпляра с основным потоком ?

Заранее благодарен.
Вложения
Тип файла: txt Код.txt (1.7 Кб, 136 просмотров)
SerzhVl вне форума Ответить с цитированием
Старый 21.06.2010, 19:56   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Цитата:
обращение к элементам формы должно происходить в основном !!! потоке
обращение к элементам формы должно быть из того же потока в котором они были созданы - так правильней

переделать чтоб было правильно довольно легко - у каждого контрола если метод Invoke или BeginInvoke который прининмает делегат и выполняет его в "правильном" потоке..

если этот объект com используется(активно) где-то еще кроме потока можно добавить синхронизацию с помощью lock

но если программка маленькая проще оставить все как есть..
m0nax вне форума Ответить с цитированием
Старый 21.06.2010, 20:09   #3
SerzhVl
 
Регистрация: 30.05.2010
Сообщений: 9
По умолчанию

То есть я так понимаю, нужно просто следить за тем, чтобы не было
случайного одновременного вызова данного метода ?
Спасибо, все понял.

Последний раз редактировалось SerzhVl; 21.06.2010 в 21:22.
SerzhVl вне форума Ответить с цитированием
Старый 22.06.2010, 22:41   #4
SerzhVl
 
Регистрация: 30.05.2010
Сообщений: 9
По умолчанию

Извините, осталась одна неясность. С контролами я разобрался, но
экземпляр структуры STRTComPort ? Он глобальный, значит вероятно,
я полагаю, он не принадлежит никакому потоку. Разные потоки вызывают
его методы, а методы в результате инициализируют поля структуры
(смысл структуры - собрать в себе все, что относиться к порту).

Скажите, принадлежит ли объявленный глобальный экземпляр
структуры какому - либо потоку конкретно ?

Заранее благодарен.
SerzhVl вне форума Ответить с цитированием
Старый 24.06.2010, 01:47   #5
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

конечно, он принадлежит основному потоку

по-хорошему вообще всегда надо синхронизацию делать, просто если нет знаний по этой теме, но хочется написать програмку для себя/препода то можно схалтурить..но это не правильно и не надежно
m0nax вне форума Ответить с цитированием
Старый 25.06.2010, 19:34   #6
SerzhVl
 
Регистрация: 30.05.2010
Сообщений: 9
По умолчанию

Спасибо. Знаний действительно маловато, но уж очень хочется хотя бы небольшие программки писать, но полезные. Пока только для себя. Насчет синхронизации, да действительно можно проворонить. Вроде в структуре все нормально, функция чтения порта - в фоновом потоке, функция записи - в основном. Они работают и вроде все нормально... Но о результатах окончания своей работы они сообщают одной и той же переменной (true, false). Вот и проворонил... В общем понятно, еще раз спасибо.
SerzhVl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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