Главная страница
    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.071 c
2-1168970687
malyar
2007-01-16 21:04
2007.02.04
opendialog & savedialog


1-1166039083
Sergey3
2006-12-13 22:44
2007.02.04
чтение-запись в RSS


2-1168776088
Rembo
2007-01-14 15:01
2007.02.04
Хранение данных


15-1168700215
Другой
2007-01-13 17:56
2007.02.04
Вопрос к Украинцам из Львова. Это правда?


2-1168860891
Есипенко
2007-01-15 14:34
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский