首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于线程传送消息主程序怎样接收的有关问题

2013-12-04 
关于线程传送消息主程序怎样接收的问题我现在是想把线程中的值发送给主程序,主程序接收到再处理并显示在界

关于线程传送消息主程序怎样接收的问题
我现在是想把线程中的值发送给主程序,主程序接收到再处理并显示在界面列表中,以避免在线程中处理导致内存泄漏而挂机的情况发生,现在不知道在主程序中是怎样的接收线程传送过来的消息和内容,如果用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;

按下ctrl+shift+c生成实现代码
然后完成实现代码
procedure TForm1.OnThreadMsg(var msg: TMyItemMessage);
begin
  ShowMessage(msg.item.captionstr);
end;


在线程中可以使用SendMessage/PostMessage,区别是SendMessage会阻塞等消息处理完,PostMessage则不会,所以使用PostMessage的时候,一定要注意!类对象不能释放了!
SendMessageForm1.Handle, WM_MYITEM, Integer(x), 0);
PostMessage(Form1.Handle, WM_MYITEM, Integer(x), 0);

热点排行