Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Про указатели [D7]


Alex_KV ©   (2006-10-16 19:46:00) 

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


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


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


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


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


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

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


DrPass   (2006-10-17 10:32:00) [2]


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

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


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


> Alex_KV   (17.10.06 10:16) [3]


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

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


Alex_KV   (2006-10-17 10:16:00) [4]

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

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


Loginov Dmitry   (2006-10-16 19:56:00) [5]

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


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

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


Ketmar   (2006-10-16 19:50:00) [6]

код давай.

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо