Форум: "Начинающим";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];
ВнизИз потока надо передать строку в VCL сообщением Найти похожие ветки
← →
OW © (2012-01-19 10:06) [0]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
а получается
”š
(”š
явно что-то неправильно. Забыл где, что-то не так с потоком/dll/ и строками? Что-то вроде из такого .. совсем забыл..
← →
OW © (2012-01-19 10:09) [1]ааа!!
это ж прямой угол :)
StrPas(PChar(Integer(MSG.LParam))); так работает
← →
Dimka Maslov © (2012-01-19 10:10) [2]Если мы делаем 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:22) [3]
> Dimka Maslov © (19.01.12 10:10) [2]
спасибо
да, так лучше
← →
Медвежонок Пятачок © (2012-01-19 11:14) [4]Если мы делаем SendMessage, то всё должно катить
не всегда.
Если в потоке, которому посылается строка, использование ее сделано не прямо, а тоже через посылку сообщения (асинхронного конечно же), то сендмессадж в посылающем может завершиться раньше, чем наступит время реального использования строки, которая к тому времени может уже помереть, если она локальная переменная процедуры. Например если в обработчике не делается ее копия через стрпас.
← →
OW © (2012-01-19 11:40) [5]
> Медвежонок Пятачок © (19.01.12 11:14) [4]
ага, сталкивался уже.
Копию всегда стараюсь делать теперь
← →
Dimka Maslov © (2012-01-19 11:57) [6]
> Медвежонок Пятачок © (19.01.12 11:14) [4]
Это для PostMessage справедливо. SendMessage это прямое обращение к функции окна, а не через очередь сообщений. И выполняется SendMessage в контексте вызывающего потока, так что переменная будет жива до тех пор, пока управление назад не передастся.
← →
Dimka Maslov © (2012-01-19 12:03) [7]
> И выполняется SendMessage в контексте вызывающего потока
Враки. Прочитал MSDN "Система переключается на другой поток и вызывает оконную функцию... Посылающий поток блокируется пока получающий обрабатывает сообщения". Но в любом случае переменная останется живой до возврата управления. А как полученным адресом распоряжается поток-получатель, это уже на совести потока получателя, делать копию или нет.
← →
Медвежонок Пятачок © (2012-01-19 12:52) [8]Это для PostMessage справедливо.
Начинаем мы и посылаем сендмессадж.
На том конце строка присваивается капшену лэйбла.
Через асинхронное сообчение.
итого: на момент обработки асинхронного сообщения смены капшена наша строка скорее всего уже мертва.
это имелось ввиду.
← →
OW © (2012-01-19 13:03) [9]я точно не помню, но по-моему через Send делал и нарвался.
Сначала через Post - сразу нарвался. Потом на Send сменил, не критично было через что именно.
Оно конечно, если подумать, не должно быть. Но, по моему было. Там много чего было понаписано, сроков было гораздо меньше :)
проще было сделать копию. С тех пор копию делаю всегда (почти).
← →
RWolf © (2012-01-19 13:37) [10]зачем вообще передавать данные сообщениями?
ставьте их в очередь, а сообщениями просто оповещайте приёмник о том, что в ней что-то есть.
← →
Dimka Maslov © (2012-01-19 13:45) [11]
> Медвежонок Пятачок © (19.01.12 12:52) [8]
И Label.Caption, и StaticText.Caption, Memo.Lines.Add работают вполне даже синхронно через серию Performов. Так что в нашем случае можно не делать копию. В других случаях - надо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c