Текущий архив: 2004.05.16;
Скачать: CL | DM;
ВнизПомогите решить проблему? Найти похожие ветки
← →
Style © (2004-04-22 10:06) [0]Существует объект класса TMemoryStream
Указатель на этот объект я записываю в объект другого класса
в данном случае TCustomWinSocket.Data: pointer
Мне нужно прочитать данные из Stream, а сам Stream может быть уничтожен из другого потока. т.е. указатель по которому я пытаюсь обратиться к моему стриму существует, а сам объект уже давно уничтожен.
Как мне проверить Существует ли TMemoryStream по этому адресу?for i := 0 to Server.Socket.ActiveConnections - 1 do
begin
if( Server.Socket.Connections[i].Data <> nil) then
begin
if(TMemoryStream(Server.Socket.Connections[i].Data).Position =
TMemoryStream(Server.Socket.Connections[i].Data).Size) then
Server.Socket.Connections[i].Close;
end; //if
end; //for
← →
Yar-Com (2004-04-22 10:15) [1]может исключения использовать?
← →
Style © (2004-04-22 10:39) [2]
> Yar-Com (22.04.04 10:15) [1]
Думаю, что использовать try except на EAccessViolation - не есть хорошо :(
← →
Fredericco © (2004-04-22 10:50) [3]
> сам Stream может быть уничтожен из другого потока
А нельзя ли еще и указатель из другого потока убить?
← →
PVOzerski © (2004-04-22 10:55) [4]Покаюсь: с WinSocket не работал. Но мысль появилась.
А если сделать потомка tMemoryStream c дополнительным полями/свойствами, содержащим его индекс в Server.Socket.Connections и адрес этого Server.Socket.
После присвоении Server.Socket.Connections[i].Data:=Stream1 делаем что-то вроде
Stream1.OwnerSocket:=Server.Socket;
Stream1.OwnerSocketPos:=i;
А из деструктора нашего Stream1 вызываем
if assigned(OwnerSocket)then
OwnerSocket.Connections[OwnerSocketPos].data:=nil;
← →
Style © (2004-04-22 10:56) [5]
> А нельзя ли еще и указатель из другого потока убить?
Не хотелось бы мне править ScktComp.pas
Может мне как нить Stream.Destroy перехватить?
← →
Style © (2004-04-22 10:58) [6]
> PVOzerski © (22.04.04 10:55) [4]
Как раз об этом подумал :)
Но может есть вариант и проще?
← →
Vuk © (2004-04-22 11:07) [7]Что-то не то с логикой приложения. Нужно как-то синхронизировать обращения к объекту, чтобы не допустить его удаления, когда он нужен кому-нибудь еще. А можно и интерфейсами воспользоваться (IStream).
← →
Style © (2004-04-22 11:27) [8]
> чтобы не допустить его удаления
В том то и дело, что удаляю его не я, а Socket.
Все Всем Спасибо я разобрался!
Вообще я отправляю Stream, у CustomWinSocket есть такая фукция SendStream. В хелпе написано - не уничтожайте Stream после вызова функции за вас это сделает сам компонент. А мне нужно отследить событие отправки всего Stream. Для этого у сокета есть событие OnWrite, на этом событии я по идее должен закрыть сокет. Но самое интересное что это событие имеет такое гадкое свойство иногда не вызываться, соотвественно соединение не разрывается. Для этого в основной нити я решил проверить равна ли позиция стрима его размеру (Position = Size), но вот когда событие OnWrite срабатывает, то Stream освобождается из памяти, а указатель на него нет! Так вот я сейчас просто обнулил Data:=nil на Событии OnWrite :) Соответственно если сработало событие OnWrite то (Position = Size) не будет проверятся т.к. коннект уже разорван и Stream освобожден.
← →
Igorek © (2004-04-22 11:41) [9]
> Style © (22.04.04 10:06)
Имхо никак нельзя решить задачу. Это называется "дикий указатель".
Страницы: 1 вся ветка
Текущий архив: 2004.05.16;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.044 c