OutOfProcess-сервер: поднять событие во всех клиентах

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение hclubmk » 07.02.2011 (Пн) 22:04

Есть OutOfProcess-сервер (ActiveX EXE), выполняющий роль хранилища данных для межпроцессового взаимодействия.
При изменении данных одним из клиентов, необходимо оповестить всех остальных клиентов о произошедшем (поднять событие).
Изображение
Клиент "Б" изменяет данные: Server.Value = X. Метод Value понимает событие OnValueChange, но это событие возникает/происходит только в клиенте "Б", вызвавшем метод Value. В клиенте-же "А", который и нужно оповестить, это событие не возникает/происходит.
Свойства класса:
DataBindingBehavior = vbNone
Instancing = MultiUse
Persistable =vbNotPersistable

Собственно, вопрос: как поднять событие OnValueChange в клиенте "А" ?
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Хакер » 07.02.2011 (Пн) 22:06

hclubmk писал(а):В клиенте-же "А", который и нужно оповестить, это событие не возникает/происходит.

Значит клиент-А обладает ссылкой на другой объект, а не тот, у которого рейснуто событие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение hclubmk » 07.02.2011 (Пн) 22:09

Не обладает.
Если клиент "А" изменит Value, то при проверке клиентом "Б" значения Value, оно оказывается таким, какое было установлено клиентом "А".
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Хакер » 07.02.2011 (Пн) 22:11

hclubmk писал(а):Если клиент "А" изменит Value, то при проверке клиентом "Б" значения Value, оно оказывается таким, какое было установлено клиентом "А".

Это ещё само по себе ни о чём не говорит. Может быть Get-хендлер свойства читает его значение из общего файла или общей БД.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение hclubmk » 07.02.2011 (Пн) 22:14

Нет ни общего файла, ни другого хранилища, есть только переменная, принадлежащая серверу. Она и только она принимает и отдает.
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Хакер » 07.02.2011 (Пн) 22:19

hclubmk писал(а):есть только переменная, принадлежащая серверу.

Вот именно: принадлежащая серверу, а не конкретному экземпляру класса. В таком случае все экземпляры класса будут возвращать общее значение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение hclubmk » 07.02.2011 (Пн) 22:37

Хм.
Хакер писал(а):Значит клиент-А обладает ссылкой на другой объект

В таком случае, как передать ссылку на тот-же самый объект?
Научились ли Вы радоваться трудностям?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Хакер » 07.02.2011 (Пн) 22:43

Это противоестественный вопрос.

Я не знаю, что у тебя за модель, и что олицетворяют экземпляры классов. Но, как бы там ни было, это уже всецело твоя забота — сделать так, чтобы клиенты, работающие с одним объектом предметной области, получали ссылку на один и тот же ООП-объект.

Я, к тому же, даже не знаю, как вообще твои клиенты получают ссылку на объект внутри сервера.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Antonariy » 07.02.2011 (Пн) 23:17

hclubmk, в описании нет ни слова про то, как создается серверный объект. Подозреваю, что просто объявлен в обоих клиентах как new, или там же через new создается. И в этом случае Хакер прав - у клиентов разные объекты. Однако он не прав насчет противоестественности вопроса. :wink: Слышал про GetObject? Так вот он-то тебе и нужен. Не важно, какой из клиентов запускается первым, любой должен сначала выполнить GetObject и тем самым попытаться получить "тот же" объект. Если сервер не запущен, GetObject завершится ошибкой и вот тут-то вступает в действие new. Однако, чтобы GetObject заработал с твоим сервером, ты должен познакомиться с доселе неизвестной тебе сущностью: Running Object Table. Описано пугающе сложно, но читать статью полностью не обязательно, достаточно лишь получить представление, с чем это едят. Реализация занимает несколько строк и находится здесь, например.

Процедура AddToROT должна (если у сервера нет графического интерфейса и он не запускается сам по себе как эксель, например) запускаться в Class_Initialize, а RemoveFromROT в Terminate. Class_Initialize должен выполняться единожды, если это происходит несколько раз, значит где-то косяк. Все переменные, где хранятся данные потребные клиентам, должны быть перенесены в класс. Не то чтобы это что-то сильно изменило в твоем случае, но это концептуально правильный подход и нужно себя к этому приучать.
Последний раз редактировалось Antonariy 07.02.2011 (Пн) 23:39, всего редактировалось 2 раз(а).
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение Хакер » 07.02.2011 (Пн) 23:29

Antonariy писал(а):Однако он не прав насчет противоестественности вопроса.

Он противоестественный, потому что поставлен так, как будто сама по себе попытка передать ссылку на один объект ведёт на деле к передачи ссылок на разные объекты, а чтобы передались ссылки на всё-таки один объект, нужно сделать что-то сверхъестественное.

А уж вопрос «просто как передать» — выглядит странным (как-то же автор получил свою ссылку). Тут надо было бы тогда огласить, что он получил с использованием New/CreateObject/CoCreateInstance.

А уж самих способов передачи ссылки между процессами можно назвать много (много с использованием ROT, плюс самодельные извращенства без ROT).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: OutOfProcess-сервер: поднять событие во всех клиентах

Сообщение hclubmk » 08.02.2011 (Вт) 9:36

Antonariy, спасибо за содержательные разъяснения - всё именно так и оказалось. Заработало - как и требовалось.
Всё когда-то бывает впервые :wink:
Научились ли Вы радоваться трудностям?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 93

    TopList