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

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

Отсылка сообщений [D7, WinXP]


dzr_gregory ©   (2007-10-21 14:12:00) 

Всем доброго времени суток. У меня такая проблема - необходимо в программе через SendMessage() отправить сообщение самому себе. Делаю так:
1. Объявляю константы сообщения:

const
 WM_MY_MESSAGES = WM_USER + 1983;
 MSG_ADD2LOG = WM_MY_MESSAGES + 1;

2. Декларирую обработчик в главной форме приложения:

   // Мои обработчики событий
   procedure OnMsg_ADD2LOG(var Msg: TMessage); message MSG_ADD2LOG;

3. Мне необходимо отправить сообщение с неким параметром, в данном случае это указатель на строку pChar. Делаю так:

var
 ErrMsg: string;
 pErr: pChar;
begin
 pErr := '123';
 SendMessage(Handle, MSG_ADD2LOG, 0, Integer(@pErr));

4. В обработчике OnMsg_ADD2LOGпишу:

procedure TfrmMain.OnMsg_ADD2LOG(var Msg: TMessage);
var
 pErr: PChar;
begin
 ShowMessage('da da da!!!');
 pErr := PChar(Pointer(Msg.LParam)^);
 ShowMessage(pErr);
end;


Вопрос: правомерна ли такая передача параметра, не будет ли утечки памяти (ведь созданная строка не освобождается), правильно ли передавать указатель на локальную переменную, память под которую будет освобождена при выходе из функции?


dzr_gregory   (2007-10-23 10:36:00) [1]


> Нет, резюме немножео не такое... Можно, например, в одной
> нити вызывать StrNew для формирования строки, отправлять
> этот указатель через PostMessage и забывать про него, а
> StrDispose вызывать уже в обработчике этого сообщения...
>  Память не обязательно освобождать в той же нити, в которой
> она была выделена

Хмм... Тоже можно.


Однокамушкин   (2007-10-21 16:25:00) [2]


> dzr_gregory   (21.10.07 15:29) [6]

Нет, резюме немножео не такое... Можно, например, в одной нити вызывать StrNew для формирования строки, отправлять этот указатель через PostMessage и забывать про него, а StrDispose вызывать уже в обработчике этого сообщения... Память не обязательно освобождать в той же нити, в которой она была выделена


dzr_gregory   (2007-10-21 15:29:00) [3]

В общем, резюме. Приведенный код имеет право на жизнь лишь в случае SendMessage. Просто у меня в приложении будет n потоков, которые будут добавлять записи в лог, и я подумал что SendMessage будет весьма кстати...


DVM   (2007-10-21 15:15:00) [4]


> сделаю PostMessage отправив указатель на переменную, тут
> же освобожу ее. Где гарантия, что событие обработается раньше
> чем освободится память?

Так скорее всего и не будет. Получишь свой AV заслуженный. Либо освобождай там где получил сообщение, либо SendMessage


Reindeer Moss Eater   (2007-10-21 14:58:00) [5]

Нет гарантии. Но и утечки из-за постмессадж тоже не будет.


dzr_gregory   (2007-10-21 14:57:00) [6]

А если отправка будет происходить с помощью PostMessage? Допустим я сделаю так: Зарезервирую память под переменную, сделаю PostMessage отправив указатель на переменную, тут же освобожу ее. Где гарантия, что событие обработается раньше чем освободится память?


Reindeer Moss Eater   (2007-10-21 14:47:00) [7]

Sendmessage никак не влияет на то, будет ли утечка или нет.


Однокамушкин   (2007-10-21 14:37:00) [8]

В данном случае правомерна, потому что для литерала '123' выделяется память в сегменте кода, и эта память никогда не освобождается, а переменная pErr будет просто указывать на эту область в сегменте кода... Вот если вы переменной не литерал присвоите, а что-то другое, тогда, возможно, надо будет освобождать память, но это уже надо конкретно смотреть, что и как вы присваиваете

Только не понимаю, зачем вам указатель на указатель - всё делается проще
SendMessage(Handle, MSG_ADD2LOG, 0, Integer(pErr));

pErr := PChar(Msg.LParam);


Наверх

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