COM
От: Долгов Сергей Сергеевич Украина  
Дата: 14.12.01 12:51
Оценка:
Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.
Re: COM
От: Dima2  
Дата: 14.12.01 14:52
Оценка:
Здравствуйте Долгов Сергей Сергеевич, Вы писали:

ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.


А сервер вы сами писали? Если да, то начем?
А вообще нужно код, который следит за блокировкой
сервера и убрать код, который закрывает exe при кол-ве
блокировок = 0.

Если сервер написан на ATL, то просто уберите строчку
// _Module.StartMonitor();
Re: COM
От: VD Россия  
Дата: 14.12.01 14:53
Оценка:
Здравствуйте Долгов Сергей Сергеевич, Вы писали:

ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.


Непонятно только зачем это нужно, если у нет ниодного клиента?
Система автоматически выгружает сервер, если число ссылок на него становиться равным нулю.
Искуственно можно добиться не уменьшения счетчика ссылок на него (не вызывать Release()).
Только лучше этого не делать.
Re: COM
От: IT Россия linq2db.com
Дата: 14.12.01 14:53
Оценка:
Здравствуйте Долгов Сергей Сергеевич, Вы писали:

ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.


Сделать можно, и хотя это не по правилам COM, но те же MS Word и Excel их успешно нарушают.
Вариантов это сделать много, самый простой вызывать AddRef после создания основного объекта приложения ещё раз. Когда приложение нужно будет закрыть надо не забыть вызвыть Release.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: COM
От: Dima2  
Дата: 14.12.01 14:57
Оценка:
Здравствуйте VD, Вы писали:

VD>Непонятно только зачем это нужно, если у нет ниодного клиента?

VD>Система автоматически выгружает сервер, если число ссылок на него становиться равным нулю.

Ну почему иногда бывает очень нужно.
Re[3]: COM
От: VD Россия  
Дата: 14.12.01 14:59
Оценка:
Здравствуйте Dima2, Вы писали:

D>Ну почему иногда бывает очень нужно.


Буду рад узнать для чего?
Re[4]: COM
От: Dima2  
Дата: 14.12.01 15:03
Оценка:
Здравствуйте VD, Вы писали:

VD>Здравствуйте Dima2, Вы писали:


D>>Ну почему иногда бывает очень нужно.


VD>Буду рад узнать для чего?


Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что..., или например клиент дал задание для сервера и отвалил.
Re[5]: COM
От: IT Россия linq2db.com
Дата: 14.12.01 15:38
Оценка:
Здравствуйте Dima2, Вы писали:

D>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что...,


Для этого в ATL существует специальная поддержка, находится в основном модуле:

const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down

D>или например клиент дал задание для сервера и отвалил.


А кто потом этот объект убивает?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: COM
От: Dima2  
Дата: 15.12.01 05:51
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Dima2, Вы писали:


D>>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что...,


IT>Для этого в ATL существует специальная поддержка, находится в основном модуле:


IT>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down


5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и
опять будет ожидать запуска сервера по полной программе.
Re[7]: COM
От: IT Россия linq2db.com
Дата: 15.12.01 06:21
Оценка:
Здравствуйте Dima2, Вы писали:

IT>>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down


D>5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и

D>опять будет ожидать запуска сервера по полной программе.

Никто не мешает поменять 5000 на наиболее подходящий вариант.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: COM
От: Dima2  
Дата: 15.12.01 11:14
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Dima2, Вы писали:


IT>>>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down


D>>5000 может оказаться маловато, клиент может соединиьтся и через 7000...1000000 и

D>>опять будет ожидать запуска сервера по полной программе.

IT>Никто не мешает поменять 5000 на наиболее подходящий вариант.


В принципе да, но этот вариант будет приближаться к варианту когда сервер вообще не выгружается.
Re[5]: COM
От: VD Россия  
Дата: 16.12.01 11:24
Оценка:
Здравствуйте Dima2, Вы писали:

D>Ну например я делал сервер, который долго запускается (по независящим от него причинам), а клиенты могут достаточно часто соединятся и отваливать так что..., или например клиент дал задание для сервера и отвалил.


Вообще-то в таких случаях лучше делать сервер, например, системным сервисом, чтобы он грузился до запуска клиента, а не через клиента.
Вот только дело-то в другом. Что вы понимаете под соединяться и отваливать?
Если соединяться — это, например, вызов CoCreateInstance() из клиента, то чтобы получать указатель на одну и ту же копию сервера, нужно соответствующим образом настроить Class Factory сервера, иначе каждый запрос клиента будет создавать новую копию сервера.
Re[6]: COM
От: VD Россия  
Дата: 16.12.01 11:32
Оценка:
Здравствуйте IT, Вы писали:

IT>Для этого в ATL существует специальная поддержка, находится в основном модуле:


IT>const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down


Да, только это задержка не на загрузку, а на выгрузку — before shutting down.
А на загрузку вроде никаких задержек нет... да и быть не должно.

IT>А кто потом этот объект убивает?


В том-то и дело, что сервер потом никто не убъет (если он не настроен специальным образом),
т.к. будет висеть одна или более пустых ссылок (RefCount > 0).
Re: COM
От: iLLness  
Дата: 16.12.01 20:23
Оценка:
Здравствуйте Долгов Сергей Сергеевич, Вы писали:

ДСС>Клиент запустил EXE-сервер. Возможно ли, чтобы при закрытии клиента сервер продолжал работать? Заранее благодарен за ответы.


А по-моему в IClassFactory есть очень простой метод LockServer(), именно для этих целей.
Илья Лощинин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.