![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при отправке на клиент [D7, Win2k]
Tor © (2005-11-01 11:02:00)Доброго времени сутов ALL!
При установке соединения клиента с сервером вызывается эта процедура и все проходит на ура, но когда второй раз она вызывается, то в строчке с коментарием появляется ошибка:
Access violation at address 00566BD4 in module 'ITServer.exe'. Read of address 00000000.
Получается что такого обьекта как TIdPeerThread(AThread^).Connection уже нет. Но как так может быть.
procedure TDM.SendCmd(ACmd: Integer; AMsg: string; AThread: Pointer);
var
CommBlock: TCommBlock;
begin
CommBlock.Command := ACmd;
CommBlock.Msg := AMsg;
if Assigned(TIdPeerThread(AThread^)) then
if TIdPeerThread(AThread^).Connection.Connected then // Здесь ошибка !!!!!!!!!!!!!!
TIdPeerThread(AThread^).Connection.WriteBuffer(CommBlock, SizeOf(CommBlock), true);
end;
Digitman (2005-11-01 17:01:00) [1]
> пользовался я отладчиком, ничего путного не сказал
врешь.
причем - нагло.
Tor (2005-11-01 16:58:00) [2]Да пользовался я отладчиком, ничего путного не сказал. Ошибка скорее всего в непрапвильной передачи адреса. Ладно буду дальше пробывать, одними словами всего не добъешся.
Тема закрыта.
Digitman (2005-11-01 16:53:00) [3]когда отладчик не друг - других друзей не ищи.
Tor (2005-11-01 16:31:00) [4]Я тож не знаю че ты одну пургу несешь, а толком сказать ничего не можешь, будто тебя кото-то заствляет. Не хочешь разбираться не надо, ктонить другой поможет.
Digitman (2005-11-01 16:25:00) [5]дурь алгоритмическая какая-то ..
разбираться в этом барахле нет желания.
у тебя под рукой всегда есть встр.отладчик.
какого ляда ты им не воспользовался по сей момент - я не знаю.
Tor (2005-11-01 15:56:00) [6]А пичем тут OnExecute? Ок
Вот начало:
нажимаем на кнопку
DM.UDPClient.Broadcast(UDP_CONNECT, FOptions.UDPPort);
Дальше сервер ждет когда клиент подключится к серверу через TCP соединение вот событие на установку соединения:
procedure TDM.TCPServerConnect(AThread: TIdPeerThread);
var
FClient: TSimpleClient;
begin
// FClient := nil;
FClient := GetClientByIP(AThread.Connection.Socket.Binding.PeerIP);
if Assigned(FClient) then
begin
FClient.ClientThread := @AThread;
SetClientStatus(FClient, csLock);
end
else
AThread.Connection.Disconnect;
end;
GetClientByIP - эта ф-ция возвращает клиентский произвольный класс.
ClientThread - это указатель на поток типа TIdPeerThread
SetClientStatus - процедура установки состояния клиента. она ниже
procedure TDM.SetClientStatus(AClient: TSimpleClient;
AStatus: TClientState; Msg: string = '');
begin
...
case AStatus of
csLock: SendCmd(CMD_LOCK, Msg, AClient.ClientThread);
...
end.
...
end;
отсюда вызывается SendCmd
procedure TDM.SendCmd(ACmd: Integer; AMsg: string; AThread: Pointer);
var
CommBlock: TCommBlock;
begin
CommBlock.Command := ACmd;
CommBlock.Msg := AMsg;
if Assigned(TIdPeerThread(AThread^)) then
if TIdPeerThread(AThread^).Connection.Connected then // Здесь ошибка !!!!!!!!!!!!!!
TIdPeerThread(AThread^).Connection.WriteBuffer(CommBlock, SizeOf(CommBlock), true);
end;
Так вот этот путь который я сейчас указал проходит, но когда я второй раз вызываю процедуру SetClientStatus возникает ошибка.
Digitman (2005-11-01 15:12:00) [7]
> Вызывается, с одной и тойже процедуры
т.е. "с потолка".
ибо НЕТ никакой инф-ции о том , ИЗкакой конкретно.
в объяснениях своих пляши от обработчика OnExecute.
Tor (2005-11-01 14:42:00) [8]Вызывается, с одной и тойже процедуры. Соединение не прекращается.
Вот отсюда
SendCmd(CMD_LOCK, Msg, AClient.ClientThread);
AClient это произвольный класс который содержит указатель на клиентский паток, указатель заполняется при создании соединения в событии OnConnect у TCPServer-а.
Но AThread по своим свойствам идет на завершение. Не могу понять почему
Digitman (2005-11-01 13:39:00) [9]
> При установке соединения клиента с сервером вызывается эта
> процедура
с Луны вызывается ? или откуда ?