Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Помогите решить проблему?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
8-1077859521
SDW-syscoder
2004-02-27 08:25
2004.05.16
AVI-файл!


1-1083238862
Litr
2004-04-29 15:41
2004.05.16
TabSheet


1-1083165712
KEBZ
2004-04-28 19:21
2004.05.16
Memo и TXT


3-1082538530
Volodya_
2004-04-21 13:08
2004.05.16
Редактирование записи


1-1083317457
pavel_guzhanov
2004-04-30 13:30
2004.05.16
Опять про ocx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский