Просмотр одиночного сообщения
Old 15-11-2005, 14:56   #4
Alvarez
Registered User
 
Аватар для Alvarez
 
Сообщений: 120
Проживание: Хельсинки
Регистрация: 08-08-2005
Status: Offline
Репутация: 0
Цитата:
Сообщение от Suriken
У объекта RBasicGsmPhone вызывается метод SignalStrengthNotification. Как только сила сигнала будет обновлена, то соответствующий запрос будет иметь статус завершенного. Active object будет отслеживать изменение статуса.


Здравствуйте.
Уже понятнее. Давайте задачу решать последовательно, не сваливая в кучу всё что нужно и ненужно.
Вот у вас есть RBasicGSMPhone - это клиентский интерфейс к серверу, который уведомляет своих клиентов о наступлении каких то событий. Другими словами, это тот самый обсервер-интерфейс. Далее, ваш клиент должен установить соединение с сервером, вызвать что то типа RBasicGSMPhone::ConnectL, проверить, что всё прошло ОК, и подписаться на приём уведомлений, то есть стать обсервером. Для этого клиент вызывает функцию RBasicGSMPhone::SignalStrengthNotif ication. Далее, по наступлении события, на которое Вы подписались, у Вашего клиента должно вызваться что то типа RBasicGSMPhone::SignalStrengthChang ed. Эту функию Вы должны определить сами в клиенте, именно в неё придёт уведомление, и необходимые данные.
Всё ещё нет места для активных объектов, которые Вам так хочется поиспользовать
Не совсем понятно, почему "Как только сила сигнала будет обновлена, то соответствующий запрос будет иметь статус завершенного". Разве метод RBasicGSMPhone::SignalStrengthNotif ication асинхронный? Имеет он в параметрах аргумент TRequestStatus? Это было бы странно.
Асинхронным мог бы быть метод, напимер RBasicGSMPhone::GetSignalStrength(T RequestStatus aStatus, ...), в случае, если он требует значительного времени для отработки. Вот тогда, Ваш клиент-активный объект, передаёт в этом методе свой TRequestSatus, унаследованный от CActive, и сразу после вызова асинхронного метода, устанавливает его значение в ERequestPending, вызывая CActive::SetActive(). Ваш клиент после этого не ждёт выполнения запроса, а продолжает работу. После же отработки запроса, сервер меняет переданный вами статус на ERequestCompleted, на что фреймворк вызывает CActive::RunL вашего клиента, где Вы и обрабатываете результат, например, вызываете SignalChanged своего приложения.

Оцените ещё раз на концептуальном уровне ваше решение, не углубляйтесь в детали, просто найдите ключевые логические повороты в Вашей задаче. Я всё ещё не глядел в Ваш код. Хочется сначала понять способ, которым Вы решаете задачу. Пока ещё не понял Наверное, туп. Удачи.
 
0
 
0
    Ответить с цитированием