|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка при отправке сообщений
Добрый день, уважаемые форумчане.
Возникла такая проблема: в программе используется TServerSocket в режиме stNonBlocking, принимает сообщения и отправляет их в ответ. Также имеется процедура, которая циклично через Server.Socket.Connections[i].SendText отправляет данные клиентам: Код:
procedure TGProcessing.Multicast(st: String; exceptClient: TGLNumber); var i:Byte; temp:integer; begin if self.Count <= 0 then Exit; temp := 0; if length(st) > 0 then begin for i := 0 to self.Server.Socket.ActiveConnections - 1 do begin if self.Client[exceptClient].SocketHandle <> self.Server.Socket.Connections[i].Handle then temp := temp + self.Server.Socket.Connections[i].SendText(st); end; end; self.FSend := self.FSend + temp; end; В момент, если происходит отключение клиента, постоянно вываливается ошибка. Ошибка вываливается при обращении к self.Client в различных частях программы, но, как удалось установить, причина именно в отключении клиента. Сам экземпляр Client не удаляется, а уходит в пул, поэтому он заведомо существует. Даже если его не существует, везде стоят проверки if assigned (Client) then. Поэтому возникают три вопроса: 1) почему возникает подобная ошибка? 2) как ее можно избежать? 3) поможет ли режим stThreadBlocking для решения проблемы? Пока что не берусь переписывать код, вдруг кто-то встречался с подобным, а делать теоретически бесполезную работу не хочется, не будучи уверенным. Спасибо за ответы. |
#2
|
||||
|
||||
проверяй Connected
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Nanotentacle (09.03.2013)
|
#3
|
|||
|
|||
Спасибо, только сейчас заметил такое свойство. В понедельник проверю, но, думаю, должно сработать.
Нет, свойство connected не помогло. Есть подозрение, что событие OnClientDisconnect срабатывает позже вызова функции рассылки сообщений, несмотря на то, что клиента уже нет. Ошибку стабильно выдает вот на этой функции: Код:
function TGProcessing.GetCount: TGLNumber; var i:integer; begin result := 0; for i := 1 to MaxClients do begin if not self.Client[i].Free then inc(result); //ошибка end; end; Вообще впервые встречаюсь с тем, что ошибка происходит с переменной, которая имеет мало отношения к самой ошибке. Как вариант, возможно, дело в Socket.Data, куда я записываю указатель на Client? Да, и еще. Если убрать проверку кол-ва клиентов через функцию, указанную выше, то ошибку начинает выдавать вот здесь: Код:
procedure TGProcessing.SrvClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); var Pl:^TGClientG; LN:integer; begin LN := 0; Pl := socket.Data; if assigned(Pl) then begin LN := Pl.LocalNumber; //ошибка self.DeleteClient(Pl.LocalNumber); end; end; Последний раз редактировалось Nanotentacle, 11.03.2013 в 08:38. Причина: Это не чат! |