Главная страница
    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.15 c
15-1168580679
0x07BBh
2007-01-12 08:44
2007.02.04
2006 год: Год, когда Россия учила Запад уму-разуму


11-1145518851
smok_red
2006-04-20 11:40
2007.02.04
почему возникает


15-1168727245
ProgRAMmer Dimonych
2007-01-14 01:27
2007.02.04
И снова об XP и Vista


2-1168999667
DmitrichJ
2007-01-17 05:07
2007.02.04
Ну слишком медленный StringGrid. Что делать?


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