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

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

Из потока надо передать строку в VCL сообщением [D7, XP]


OW ©   (2012-01-19 10:06:00) 

procedure TS12NewCom.SendMsg(s: string);
var
 p: PChar;
begin
 p := PChar(s);
 SendMessage(FHWND, FMSG, 0, Integer(p));
end;

   procedure OnMyMSG(var MSG: TMessage); message WM_USER;
procedure TForm1.OnMyMSG(var MSG: TMessage);
var
 s: string;
begin
 s := StrPas(PChar(addr(Integer(MSG.LParam))));
 Memo1.Lines.Add(s);
end;

должно быть
m
m

а получается
\x8”š
(”š

явно что-то неправильно. Забыл где, что-то не так с потоком/dll/ и строками? Что-то вроде из такого .. совсем забыл..


Dimka Maslov   (2012-01-19 13:45:00) [1]


> Медвежонок Пятачок ©   (19.01.12 12:52) [8]


И Label.Caption, и StaticText.Caption, Memo.Lines.Add работают вполне даже синхронно через серию Performов. Так что в нашем случае можно не делать копию. В других случаях - надо.


RWolf   (2012-01-19 13:37:00) [2]

зачем вообще передавать данные сообщениями?
ставьте их в очередь, а сообщениями просто оповещайте приёмник о том, что в ней что-то есть.


OW   (2012-01-19 13:03:00) [3]

я точно не помню, но по-моему через Send делал и нарвался.
Сначала через Post - сразу нарвался. Потом на Send сменил, не критично было через что именно.
Оно конечно, если подумать, не должно быть. Но, по моему было. Там много чего было понаписано, сроков было гораздо меньше :)
проще было сделать копию. С тех пор копию делаю всегда (почти).


Медвежонок Пятачок   (2012-01-19 12:52:00) [4]

Это для PostMessage справедливо.

Начинаем мы и посылаем сендмессадж.
На том конце строка присваивается капшену лэйбла.
Через асинхронноесообчение.

итого: на момент обработки асинхронного сообщения смены капшена наша строка скорее всего уже мертва.

это имелось ввиду.


Dimka Maslov   (2012-01-19 12:03:00) [5]


>  И выполняется SendMessage в контексте вызывающего потока


Враки. Прочитал MSDN "Система переключается на другой поток и вызывает оконную функцию... Посылающий поток блокируется пока получающий обрабатывает сообщения". Но в любом случае переменная останется живой до возврата управления. А как полученным адресом распоряжается поток-получатель, это уже на совести потока получателя, делать копию или нет.


Dimka Maslov   (2012-01-19 11:57:00) [6]


> Медвежонок Пятачок ©   (19.01.12 11:14) [4]


Это для PostMessage справедливо. SendMessage это прямое обращение к функции окна, а не через очередь сообщений. И выполняется SendMessage в контексте вызывающего потока, так что переменная будет жива до тех пор, пока управление назад не передастся.


OW   (2012-01-19 11:40:00) [7]


> Медвежонок Пятачок ©   (19.01.12 11:14) [4]

ага, сталкивался уже.
Копию всегда стараюсь делать теперь


Медвежонок Пятачок   (2012-01-19 11:14:00) [8]

Если мы делаем SendMessage, то всё должно катить

не всегда.
Если в потоке, которому посылается строка, использование ее сделано не прямо, а тоже через посылку сообщения (асинхронного конечно же), то сендмессадж в посылающем может  завершиться раньше, чем наступит время реального использования строки, которая к тому времени может уже помереть, если она локальная переменная процедуры. Например если в обработчике не делается ее копия через стрпас.


OW   (2012-01-19 10:22:00) [9]


> Dimka Maslov ©   (19.01.12 10:10) [2]

спасибо
да, так лучше


Dimka Maslov   (2012-01-19 10:10:00) [10]

Если мы делаем SendMessage, то всё должно катить

procedure TS12NewCom.SendMsg(s: string);
begin
SendMessage(FHWND, FMSG, 0, LPARAM(PChar(s))); // давайте готовиться к 64 битам
end;

procedure TForm1.OnMyMSG(var MSG: TMessage);
begin
 Memo1.Lines.Add(PChar(MSG.LParam));
end;


OW   (2012-01-19 10:09:00) [11]

ааа!!
это ж прямой угол  :)
StrPas(PChar(Integer(MSG.LParam))); так работает


Наверх

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