Главная страница
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.027 c
1-1083227462
AmazdDexter
2004-04-29 12:31
2004.05.16
Random Form Show


1-1083334497
Smirnoff
2004-04-30 18:14
2004.05.16
как в конце строки удалить символ перевода стоки?


14-1082726077
Igor_thief
2004-04-23 17:14
2004.05.16
Градиентная линия


1-1083529948
KEBZ
2004-05-03 00:32
2004.05.16
Text


3-1082623665
AlexXn
2004-04-22 12:47
2004.05.16
Одновременный доступ к данным