Главная страница
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.067 c
9-1142779428
Sam Stone
2006-03-19 17:43
2007.02.04
Проникновение объектов друг в друга


2-1168579608
VOPROS
2007-01-12 08:26
2007.02.04
Группировка по месяцам на русском


2-1169037970
Pasha L
2007-01-17 15:46
2007.02.04
png в bmp


1-1165667654
Kulnic
2006-12-09 15:34
2007.02.04
Player


2-1169389410
$00FF00
2007-01-21 17:23
2007.02.04
Контролы ХР-стиля в API