|
|
|
Supreme Being
      
участник
Last Login: 12.06.2007 20:05
Сообщ.: 279,
Visits: 3 001
|
|
| Проблема такая: имеется объект типа А в котором создается объект типа Б (вложенный). В классе Б есть сокет по которому передаются или принимаются комманды. Для чтения приходящих комманд я создаю отдельный поток. Когда такая комманда получена, её необходимо передать в родительский объект А. Вот тут и возникает проблема. Если делать это с помощью события (Event), то возникает ошибка. Если использовать Callback функции, результат тот же. Так как callback вызывается из дочернего потока а не в основном. Это как-то связанно с управляемыми потоками и синхронизацией данных. К примеру в формах, это можно решить с помощью свойств и методов объекта Control - InvokeRequired и Invoke. А что делать, если мой объект не является контролем и не наследует от него этого решения? Я немного запутался с этими управляемыми потоками. Может кто-нибудь объяснить как они работают или дать линки на более или менее понятные статьи? Хорошо бы и к моему примеру разъяснения. Спасибо
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| А какая ошибка возникает при использовании событий?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 12.06.2007 20:05
Сообщ.: 279,
Visits: 3 001
|
|
| Хорошенько подумав, я пришел к выводу, что проблема не в использовании Events. Ошибка как раз возникала в формах и использование Invoke решает эту проблему. Мне хотелось, чтобы при изменении данных в классе Б класс А автоматически реагировал бы на эти изменения. Но в этом случае придется построить нечто типа WinProc в которой происходит прием и обработка сообщений к окну. В результате чего поток начинает работу только когда приходит сообщение, а все остальное время он спит. Это нечто другое. В моем случае, чтобы разделить обработку мне скорее всего больше подойдет не сихронные (Asyncronous) вызовы с помощью BeginInvoke и EndInvoke. Так как я работаю с сокетами, то можно использовать его BeginReceive или BeginSend. И здесь нужно только правильно отследить и синхронизировать блоки при чтении/записи информации. Объекту А придется самому обращаться к Б каждый раз, когда ему потребуется проверить наличие пришедшей информации.
|
|
|
|