Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.039 c
1-1083225929
Игорь
2004-04-29 12:05
2004.05.16
Когда я пишу в RichEdit текст вот такой


3-1082112658
Dimbas
2004-04-16 14:50
2004.05.16
Проблема открытия базы с CD


1-1083670457
Alkmas
2004-05-04 15:34
2004.05.16
FindClass из DLL


9-1073424736
Orcy
2004-01-07 00:32
2004.05.16
Как загрузить 3ds в OpenGL


14-1083006156
ЧупаЧупс
2004-04-26 23:02
2004.05.16
Оформление