Число подключенных клиентов к Dcom-серверу

  • Автор темы V88
  • Дата начала
V

V88

Всем доброго времени суток! :(
Есть сервер на основе технологии DCOM. И ести клиент, который подключается посредством SocetConnection. Ответьте мне пожалуйста каким образом можно узнать число одновременно подключенных клиентов, а также узнать когда клиентов стало больше или меньше. Я пробовал делать следующим образом (как описано в статье ):
Теперь вернемся к индикации числа подключенных к серверу клиентов. Для этого расположим на форме компонент TLabel и его свойству Caption зададим значение "0". Кроме того, опишем процедуру изменения значения счетчика. Переменная FCount содержит число подключенных к серверу клиентов. Процедура UpdateCount изменяет значение счетчика подключений.

type
Код:
 TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
FCount: Integer;
public
{ Public declarations }
Procedure UpdateCount (FCon: bool);
end;
При установке соединения в процедуру передается значение True, при отключении False.
Код:
Procedure TForm1.UpdateCount (FCon: Bool);
Begin
If FCon Then
Inc(FCount)
Else
Dec(FCount);
Label1.Caption:=intToStr(FCount);
End;
Для того чтобы значения счетчика изменялост описанную процедуру необходимо поместить в события модуля RDM Create и Destroy соответственно.
Код:
procedure TSrvApp.RemoteDataModuleCreate(Sender: TObject);
begin
Form1.UpdateCount(True);
end;

procedure TSrvApp.RemoteDataModuleDestroy(Sender: TObject);
begin
Form1.UpdateCount(False);
end;

Но сервер на этапе TSrvApp.RemoteDataModuleCreate зависает намертво :unsure: . Путем многих проб и усилий выяснилось, что сервер зависает из-за обращения из RemoteDataModule к форме Form1 сервера. Что делать? :please:

P.S. Гуглил два вечера :) , ничего стоящего кромеме выше представленнлй статьи не нашел.
 
T

Titan

у вас явно какая-то элементарная ошибка.

если еще актуально - присоедините проектик.
 
V

V88

Да. Элементарная ошибка. Не знаю почему, но для Label1.Caption надо было обязательно присвоить 0 (или какое-нибудь другое значение целого типа). И все же после подключения 9-го клиента сервер зависает. Может где-то ставиться лимит подключенных клиентов?
Сам проект весит много. Во вложении простой пример без лишнего кода. Для его работы необходимо на диске C:\ создать файл 111.txt
 

Вложения

  • ______.rar
    749,4 КБ · Просмотры: 222
V

V88

... Поторопился с выводами...
Число подключаемых клиентов я думаю не ограничено по умолчению. Оказывается все дело в компоненте TLabel. Абсолютно не знаю почему :( , но на сервере TLabel.Caption отказывается принемать значение больше 9. Потестил с TEdit - он вообще не принемает никакие значения, сервер просто зависает. Потом решение нашлось с компонентом TPanel. Все работает на ура... пока что. Не знаю как с другими компонентами. Буду тестить.
 
T

Titan

Думаю, что проблема, кроется именно в вашем дополнительном коде.
Проект, который вы приложили, ничего из себя не представляет, обычный пример с использованием 3-х звенки.
Количество отображается нормально.

Главное в таких случаях четко понимать какая потоковая модель и т.д у Вас используется на сервере.
Необходимо помнить, что в ряде случаев один и тот же код могут пытаться выполнить несколько клиентов и если код не
рассчинан на это, то ошибок и сбоев не избежать.
 
V

V88

Все, я разобрался. Тему можно закрыть. :)
Как я писал выше, все дело было в компоненте TLabel, вместо него просто я использовал TDBText и проблема решилась.
P.S. В примере, выложенным выше мною, также использовался TLabel. Там счетчик может только инкрементировать только до 9 почему-то. Я не стал разбирать почему. Кто знает объясните, просто ради интереса.
 
T

Titan

>>вместо него просто я использовал TDBText и проблема решилась.
это существенно.

>> Там счетчик может только инкрементировать только до 9 почему-то. Я не стал разбирать почему.

запускал я ваш пример 12 раз и счетчик показал 12....
 
V

V88

запускал я ваш пример 12 раз и счетчик показал 12....
Может у меня просто Delphi, отличной чем у вас версии. У меня Delphi 7. Пробовал также запускать этот же пример на другом компе - тоже самое. На другом компе тоже был установоен Delphi 7. У вас какая версия?
 
T

Titan

Вообще от версии Delphi не особо должно зависеть, как мне кажется.
Запускал на работе, либо на 2010 или на XE , точно не помню.
 
V

V88

Какая разница какая версия ) Главное, что у меня все зароботало как надо. И все. Тему можно закрыть, ОДНОЗНАЧНО.
Зачем себе мозг забивать))))
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!