Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Как отправить строку в нить ?   Найти похожие ветки 

 
learner ©   (2006-06-29 14:28) [0]

Делаю так:
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;

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


 
Vlad ©   (2006-06-29 14:34) [1]


> learner ©   (29.06.06 14:28)  

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


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


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


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

И в потоке

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

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


 
learner ©   (2006-06-29 16:36) [3]

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


 
Fay ©   (2006-06-29 16:50) [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 19:40) [5]

>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 20:12) [6]

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


 
Leonid Troyanovsky ©   (2006-06-29 21:14) [7]


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

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


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
15-1150564169
TUser
2006-06-17 21:09
2006.07.16
Это сделали взрослые


2-1151583575
Ega23
2006-06-29 16:19
2006.07.16
Как получить список всех созданных фреймов приложения?


2-1151323955
lobach
2006-06-26 16:12
2006.07.16
Cgi


10-1121943189
sarcin
2005-07-21 14:53
2006.07.16
JavaScript Events на IntraWeb


2-1151426032
fast2
2006-06-27 20:33
2006.07.16
Как сразу (не построчно) очистить StringGrid?