Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизПро указатели Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.917 c