Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.059 c
4-1158843222
laronov
2006-09-21 16:53
2007.02.04
Как получить данные из чужого DBGrid а


15-1168639940
kaZaNoVa
2007-01-13 01:12
2007.02.04
Универсальный вызов функции


6-1157144470
Орион
2006-09-02 01:01
2007.02.04
Прокси для TWebBrowser


15-1169017524
vajo
2007-01-17 10:05
2007.02.04
подскажите настройку интернет экплоэра


2-1169034700
AlexT1000
2007-01-17 14:51
2007.02.04
Как восстановить файл(ы) из корзины?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский