Нотификация объекта в основном потоке из дочернего потока
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Нотификация объекта в основном потоке из... Expand / Collapse
Автор
Сообщение
11.06.2007 16:53


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2007 20:05
Сообщ.: 279, Visits: 3 001
Проблема такая: имеется объект типа А в котором создается объект типа Б (вложенный). В классе Б есть сокет по которому передаются или принимаются комманды. Для чтения приходящих комманд я создаю отдельный поток.

Когда такая комманда получена, её необходимо передать в родительский объект А. Вот тут и возникает проблема. Если делать это с помощью события (Event), то возникает ошибка. Если использовать Callback функции, результат тот же. Так как callback вызывается из дочернего потока а не в основном. Это как-то связанно с управляемыми потоками и синхронизацией данных.

К примеру в формах, это можно решить с помощью свойств и методов объекта Control - InvokeRequired и Invoke. А что делать, если мой объект не является контролем и не наследует от него этого решения?

Я немного запутался с этими управляемыми потоками. Может кто-нибудь объяснить как они работают или дать линки на более или менее понятные статьи?

Хорошо бы и к моему примеру разъяснения.

Спасибо

Сообщ. #914000
12.06.2007 17:07
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
А какая ошибка возникает при использовании событий?
Сообщ. #914032
12.06.2007 18:15


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2007 20:05
Сообщ.: 279, Visits: 3 001
Хорошенько подумав, я пришел к выводу, что проблема не в использовании Events. Ошибка как раз возникала в формах и использование Invoke решает эту проблему.

Мне хотелось, чтобы при изменении данных в классе Б класс А автоматически реагировал бы на эти изменения. Но в этом случае придется построить нечто типа WinProc в которой происходит прием и обработка сообщений к окну. В результате чего поток начинает работу только когда приходит сообщение, а все остальное время он спит.

Это нечто другое. В моем случае, чтобы разделить обработку мне скорее всего больше подойдет не сихронные (Asyncronous) вызовы с помощью BeginInvoke и EndInvoke. Так как я работаю с сокетами, то можно использовать его BeginReceive или BeginSend. И здесь нужно только правильно отследить и синхронизировать блоки при чтении/записи информации.

Объекту А придется самому обращаться к Б каждый раз, когда ему потребуется проверить наличие пришедшей информации.

Сообщ. #914033
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 11:21