关于线程传送消息主程序怎样接收的问题
我现在是想把线程中的值发送给主程序,主程序接收到再处理并显示在界面列表中,以避免在线程中处理导致内存泄漏而挂机的情况发生,现在不知道在主程序中是怎样的接收线程传送过来的消息和内容,如果用TIMER控件来循环接收好像也不行(占用内存太大);如果再建立一个线程来接收后处理在主程序界面显示就完全没有意义了。这个接收是放在主界面主窗体那个事件中比较合试或应当怎样处理才是。在线程中将这个数据类传送过去主程序。
type
TmyItem=Class
captionstr:string;
ItemPhone:string;
Itemconnet:string;
Itemdate:string;
end;
[解决办法]
type
PMyItem=^TMyItem;
TmyItem=record
captionstr:string[12];
ItemPhone:string[16];
Itemconnet:string[32];
Itemdate:string[64];
end;
这样定义结构能获取连续的内存。
var
lpItem: PMyItem;
begin
......
//线程得到值后:
New(lpItem);
//这里个lpItem赋值,如:lpItem^.captionstr:='abc';...
PostMessage(WindowHnd,WM_USER+111,integer(lpItem),0);
......
end;
在响应窗口的Private部分申明:
procedure WmThreadMsg(var Msg: TMessage); message WM_USER+111;
......
procedure TSomeForm.WmThreadMsg(var Msg: TMessage);
var
lpItem: PMyItem;
str: string;
begin
lpItem:=PMyItem(Msg.WParam);
str:=lpItem^.captionstr;
......
Dispose(lpItem);
end;
[解决办法]
首先,为了方便消息处理,可以先定义一个消息结构,当然使用强制转换来取出数据也是可以的。
type
TMyItemMessage = packed record
Msg: Cardinal;
item: TmyItem;
unused: Cardinal;
Result: Integer;
end;
const
WM_MYITEM = WM_USER + 100;
procedure OnThreadMsg(var msg: TMyItemMessage); message WM_MYITEM;
procedure TForm1.OnThreadMsg(var msg: TMyItemMessage);
begin
ShowMessage(msg.item.captionstr);
end;
SendMessageForm1.Handle, WM_MYITEM, Integer(x), 0);
PostMessage(Form1.Handle, WM_MYITEM, Integer(x), 0);