Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отправить строку в нить ?


learner ©   (2006-06-29 14:28:00) 

Делаю так:
function MessToThread(ThreadID: DWord):integer;
var
Buf: string;
begin
Result:=0;
Buf:='bala - bala';
PostThreadMessage(ThreadID, 0, MY_MESSAGE_STRING, LPARAM(PChar(Buf)));
end;


В нити пытаюсь получить эту строчку :
procedure ThreadProc(pParam: Pointer); stdcall;
var
Msg: TMsg;
begin
PeekMessage(Msg,0,0,0,pm_NoRemove);
while GetMessage(Msg,0,0,0) do
 case Msg.wParam of
  MY_MESSAGE_STRING:
   MessageBox(0,PChar(Msg.lParam), PChar(Msg.lParam), MB_OK);
 end;
end;

Она приходит, но, то у нее конец обрезан,
то дописано несколько символов, непечатных :))
Как исправить ситуацию ?


Leonid Troyanovsky   (2006-06-29 21:14:00) [1]


> learner ©   (29.06.06 19:40) [5]

> В хелпе ничего не сказано про функцию, которая будет заменять
> NewStr :((


Может SetString спасет отца (мать) русской демократии?
См. например
http://groups.google.com/group/fido7.ru.delphi/msg/5ce4ca000dc61a97

--
Regards, LVT.


Fay   (2006-06-29 20:12:00) [2]

Примерно так. Или так же.


learner   (2006-06-29 19:40:00) [3]

>Fay
Т.е. примерно так ?
function MessBoxThread(pValue: PChar): DWord; stdcall;
begin
Result:=0;
try
 MessageBox(0,pValue,PChar(ParamStr(0)),MB_OK or MB_ICONINFORMATION);
finally
 ReallocMem(pValue, 0);
end;
end;

function MessBox_Thread(const Mess:string): DWord;
var
pBuf: PChar;
ThreadID:DWord;
begin
pBuf:= GetMemory(Length(Mess) + 1);
CopyMemory(pBuf, PChar(Mess), Length(Mess) + 1);
Result:=CreateThread(nil, 0, @MessBoxThread, pBuf, 0, ThreadID);
end;

В хелпе ничего не сказано про функцию, которая будет заменять NewStr :((


Fay   (2006-06-29 16:50:00) [4]

NewStr allocates a new string on the heap. Do not use NewStr in new applications.  This function is provided for backward compatibility only.


learner   (2006-06-29 16:36:00) [5]

>Игорь Шевченко
Спасибо. Помогло. Второй раз уже наступаю на эти грабли :((


Игорь Шевченко   (2006-06-29 14:47:00) [6]


> Она приходит, но, то у нее конец обрезан,
> то дописано несколько символов, непечатных :))


PostThreadMessage(ThreadID, 0, MY_MESSAGE_STRING, LPARAM(NewStr(Buf)));

И в потоке

MessageBox(0,PChar(PString(Msg.lParam)^), PChar(PString(Msg.lParam)^), MB_OK);

Ну и освободить конечно по использовании


Vlad   (2006-06-29 14:34:00) [7]


> learner ©   (29.06.06 14:28)  

Я думаю, проблема в том, что Buf надо объявлять не как string, а как PChar, потом самостоятельно выделить память под строку, скопировать в эту область ваше 'bala - bala', и только потом передать Buf в поток


Наверх

Титульная страница Поиск, карта сайта Написать письмо