Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Про указатели   Найти похожие ветки 

 
Alex_KV   (2006-10-16 19:46) [0]

Здравствуйте!
У меня возникла путаница.
Пусть есть процедура в которой есть лок. переменная list : TList.
Вызываем конструктор. Теперь переменная указывает на объект класса TList. Причем сама перем. находиться в стеке, а объект в куче.
Теперь мне надо передать ссылку на этот объект в др. поток.
Делаю PostMessage(..., ..., Integer(list), 0).
А вот теперь уже непонятно, что я передаю - ссылку на объект или адрес переменной?
После выполнения процедуры все лок. переменные явл. мусором и могут указывать куда угодно. Соответсвенно, в др. потоке, в кот пришло сообщение может получить неправ. указатель на объект.
Как тогда правильно поступать?
И еще. Если я сразу после PostMessage присваива. лок. перемю list := nil, то при обработке сообщения вываливается ошибка о неправ. указателе. Это мне кажется имеет тот же характер.
Так как же правильно передавать указатели на объекты?


 
Ketmar ©   (2006-10-16 19:50) [1]

код давай.

Integer(list) -- это ссылка на экземпляр, да.

>И еще. Если я сразу после PostMessage присваива. лок.
>перемю list := nil, то при обработке сообщения
>вываливается ошибка о неправ. указателе.
17-я строка.


 
Loginov Dmitry ©   (2006-10-16 19:56) [2]

Alex_KV   (16.10.06 19:46)
Если я сразу после PostMessage присваива. лок. перемю list := nil, то при обработке сообщения вываливается ошибка о неправ. указателе


1. А зачем выполняешь обнуление?

2. Другой поток - это основной поток того же процесса или что это?


 
Alex_KV   (2006-10-17 10:16) [3]

To Loginov Dmitry
1. Обнуление это случайно затесалось, из-за него и возник вопрос и поэтому захотелось разобраться. Вроде это безобидно должно быть.
В PostMessage в Integer(list) передается значение лок. переменной, хранящееся в стеке.  Это значение - адрес объекта.
Если я это значение выслал, а потом обнулил, то в в чем проблема?
Почему ошибка?
Что на самом деле высылается и как высылать правильно?
У меня как я уже писал есть подозрение, что ошибка возникнет и без обнуления в том случае если к моменту начала обработки сообщения процедура выславшая сообщение уже закончится и лок. переменные выйдут из зоны видимости и будут недействительны.

2. др. поток  - основной поток того же процесса


 
Сергей М. ©   (2006-10-17 10:27) [4]


> Alex_KV   (17.10.06 10:16) [3]


Если объект реально существует, то ссылаться на него можно где угодно и как угодно.

Ссылок на объект м.б. и ни одной и великое множество - от этого объект не перестает быть "живым".


 
DrPass ©   (2006-10-17 10:32) [5]


> В PostMessage в Integer(list) передается значение лок. переменной,
>  хранящееся в стеке.  Это значение - адрес объекта.
> Если я это значение выслал, а потом обнулил, то в в чем
> проблема?

Так и есть. Если ты не вызвал деструктор объекта, его адрес остается действительным, и все должно работать (хоть сама по себе такая архитектура "создать в одном потоке, убить фиг-знает-где" является довольно кривой). Ошибка в другом месте.


 
Сергей М. ©   (2006-10-17 10:38) [6]


> Если я сразу после PostMessage присваива. лок. перемю list
> := nil


..то ты просто присваиваешь ей nil.
На состоянии самого объекта это никак не отразится.


> при обработке сообщения вываливается ошибка о неправ. указателе


В дан.случае это никак не связано с присвоением локальной переменной значения nil.

Вот если бы эта лок.переменная хранила ссылку на интерфейс, тогда - да, тогда тебя поджидает засада.



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1160546413
Antoxa2005
2006-10-11 10:00
2006.10.29
Подскажите, как правильно написать, что бы при ShowModal окно не


4-1149350507
chizra
2006-06-03 20:01
2006.10.29
надо перехватить окно в модальном режиме


2-1160480556
mfender
2006-10-10 15:42
2006.10.29
Интерфейсы и reinroduce


2-1161009570
funky
2006-10-16 18:39
2006.10.29
считывание опред. строки


15-1160008584
Ketmar
2006-10-05 04:36
2006.10.29
TechnoJocks Object Toolkit для Virtual Pascal