![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отправить строку в нить ?
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 в поток