Главная страница
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.03 c
3-1147335203
Stanislav
2006-05-11 12:13
2006.07.16
Кодировка в dbf


1-1149146393
k_serg
2006-06-01 11:19
2006.07.16
ввод даннах в AutoCad


8-1138713098
example
2006-01-31 16:11
2006.07.16
Обработка JPEG


15-1150185237
iamdanil
2006-06-13 11:53
2006.07.16
Версия приложения


1-1149287685
lamer_y
2006-06-03 02:34
2006.07.16
Проблема с TStrings