Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Передача строки из доп.потока с основной   Найти похожие ветки 

 
GanibalLector ©   (2006-09-21 16:56) [0]

Господа, видел когда-то на форуме такой вот трюк для передачи строк из доп.потока в главный :

type
 TForm1 = class(TForm)
   ...
 private
   procedure Priem (var Msg:TMessage); message WM_USER+2;
 public
   { Public declarations }
 end;

procedure TForm1.Priem(var Msg: TMessage);
begin
 Memo2.Lines.Add(String(PChar(Msg.WParam)));
end;

где-то в потоке :
PostMessage(Handle,WM_USER+2,Integer(PChar("Hello,Word")),0);


Все КАК БЫ работает ;) Насколько такой подход верный?
ИМХО, не верный. Ибо при посылке ОДНОГО пробела( Integer(PChar(" ")) ) получаю AV !

Так все-же пользоваться  WM_COPYDATA ?


 
Игорь Шевченко ©   (2006-09-21 16:59) [1]


> Господа, видел когда-то на форуме такой вот трюк для передачи
> строк из доп.потока в главный :


Адрес передай и все (что, собственно и делается в приведенном коде). Потоки одного процесса разделяют общую память.

А для указанного примера лучше использовать Synchronize или SendMessage.


 
GanibalLector ©   (2006-09-21 17:23) [2]

2 Игорь Шевченко ©   (21.09.06 16:59) [1]
>Адрес передай и все (что, собственно и делается в приведенном коде). Потоки одного процесса разделяют общую память.

Вот и я так думал... Ну почему-же тогда PostMessage(Handle,WM_USER+2,Integer(PChar(" ")),0); вызывает AV?


 
Наиль ©   (2006-09-21 17:23) [3]


> при посылке ОДНОГО пробела( Integer(PChar(" ")) ) получаю
> AV !

Перед отсылкой пробела резервируется память под пробел.
Потом передаётся указатель на пробел.
При достижении End; память освобождается.
Т.к. отправка идёт через PostMessage, то программа не успевает воспользоваться адресом, вот и AV.
При использовании WM_COPYDATA строка сначала копируется в память Windows, а программе передаётся адрес на копию строки.


 
guav ©   (2006-09-21 17:53) [4]

> При использовании WM_COPYDATA строка сначала копируется
> в память Windows, а программе передаётся адрес на копию
> строки.

А что, WM_COPYDATA уже можно отправлять через PostMessage и их уже используют в рамках одного процесса ?


> PostMessage(Handle,WM_USER+2,Integer(PChar(" ")),0); вызывает
> AV?

Потому, что к Pchar приводится не строка, а char.

Рассмотри всё же и [3] , такая проблема тоже может возникнуть при не-константных строках.


 
GanibalLector ©   (2006-09-21 18:00) [5]

2 guav ©   (21.09.06 17:53) [4]
> WM_COPYDATA уже можно отправлять через PostMessage
А разве я это говорил? Через Send

> их уже используют в рамках одного процесса ?
А что мешает? Это кем-то запрещено?


 
Leonid Troyanovsky ©   (2006-09-21 18:47) [6]


> HanibalLector ©   (21.09.06 16:56)  

> procedure TForm1.Priem(var Msg: TMessage);
> begin
>  Memo2.Lines.Add(String(PChar(Msg.WParam)));
> end;

> где-то в потоке :
> PostMessage(Handle,WM_USER+2,Integer(PChar("Hello,Word")),

> Все КАК БЫ работает ;) Насколько такой подход верный?


Избыточность. Где-то в потоке :

//SendMessage(EditHandle, EM_SETSEL, dwStart, dwEnd);
SendMessage(EditHandle,  EM_REPLACESEL, ..);

--
Regards, LVT.


 
DiamondShark ©   (2006-09-21 21:32) [7]


> PostMessage(Handle,WM_USER+2,Integer(PChar("Hello,Word")), 0);

Нельзя так делать.
Возьмите за правило: адрес, полученный преобразованием строки в PChar действителен только в пределах одного оператора.


 
Leonid Troyanovsky ©   (2006-09-21 21:35) [8]


> DiamondShark ©   (21.09.06 21:32) [7]

> в PChar действителен только в пределах одного оператора.


В пределах области видимости (string), IMHO.

--
Regards, LVT.


 
DiamondShark ©   (2006-09-21 21:44) [9]


> В пределах области видимости (string),

S := "aaa";
P := PChar(S);
S := "bbb"; // в P теперь невалидный адрес

А область видимости та же.

Даже если нет переприсваиваний, проще не морочиться пп того, где компилятору вздумается разместить финализацию, а пользоваться заведомо более строгим критерием.

Тем более, что при передаче м-у потоками от того, что строка доживёт до выхода из области видимости радости не шибко много ;)



Страницы: 1 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
3-1163058620
O.O
2006-11-09 10:50
2007.02.04
UPDATE


2-1168800281
azl
2007-01-14 21:44
2007.02.04
Мигание иконки в Строке заголовка формы


15-1168654314
Константинов
2007-01-13 05:11
2007.02.04
Какой будет жизнь лет этак через двадцать?


6-1157020830
РВА
2006-08-31 14:40
2007.02.04
Добавить клиента


2-1169198094
Steep
2007-01-19 12:14
2007.02.04
Flash Drive