Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1326217120
Jimmy
2012-01-10 21:38
2012.05.20
Глубина и разряд в шахматах


2-1326879729
i2e
2012-01-18 13:42
2012.05.20
Проверить TDrawGrid на установленные опции


2-1326964751
CRLF
2012-01-19 13:19
2012.05.20
Визуальное редактирование графов


15-1326313802
Юрий
2012-01-12 00:30
2012.05.20
С днем рождения ! 12 января 2012 четверг


15-1326539168
SQLEX
2012-01-14 15:06
2012.05.20
Шахматы. Короткие партии. Аля "Клуб13"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский