Главная страница
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-1083226372
Nk
2004-04-29 12:12
2004.05.16
Подключение новой DLL работающей программой.


6-1080436071
NND
2004-03-28 05:07
2004.05.16
-= Определение подключен ли комп к сети =-


3-1082615591
mixam
2004-04-22 10:33
2004.05.16
Lookup


3-1082348585
Layner
2004-04-19 08:23
2004.05.16
Вставка записи в табл. на одном MS SQL сервере должно зеркально


3-1082103521
RavenD
2004-04-16 12:18
2004.05.16
Чем вылечить DB-файлы?