线程消息

求助:线程消息
开始一个线程
ThreadHandle:=beginThread(0,0,ReceivedaThread,@Listview1,0,ThreadId);

function ReceivedaThread(Param:pointer):integer;
var
  LV:PListView;
  {slen,}i,j:integer;
  ReceiveData:array[0..19]of VCI_CAN_OBJ;
  ErrInfo:VCI_ERR_INFO;
  lsv:Tlistitem;
  box : PTListBox;
  str,tmpstr:ansistring;
begin
  lv:=param;
  while True do
  begin
  if m_connect=0 then
  break;
  len:=VCI_Receive(VCI_CANET_UDP,1,m_cannum,@ReceiveData[0],50,200);
  if len<=0 then
  begin
  //传说中千万不能省这一步,即使你不知道是什么..我也不知道是什么..
  VCI_ReadErrInfo(VCI_CANET_UDP,m_devind,m_cannum,@ErrInfo);
  continue;
  end;
  for i:=0 to len-1 do
  begin  
  with lv.Items.Add do
  begin
  Caption:=inttostr(i);
  SubItems.Add('接收');
  if ReceiveData[i].TimeFlag=0 then
  SubItems.Add('无')
  else
  SubItems.Add('0x'+inttohex(ReceiveData[i].TimeFlag,8));
  subitems.Add('0x'+inttohex(ReceiveData[i].id,8));
  if ReceiveData[i].RemoteFlag=0 then
  SubItems.Add('数据帧')
  else
  SubItems.Add('远程帧');
  if ReceiveData[i].ExternFlag=0 then
  SubItems.Add('标准帧')
  else
  SubItems.Add('扩展帧');
  if ReceiveData[i].RemoteFlag= 0 then
  begin
  if ReceiveData[i].DataLen>8 then
  ReceiveData[i].DataLen:=8;
  SubItems.Add('0x'+inttostr(ReceiveData[i].DataLen));
  for j:=0 to receivedata[i].DataLen-1 do
  begin
  SubItems.Add(IntToHex(receivedata[i].data[2],2));
  end;
  end;

  end;
  end;
  lv.ItemIndex:=lv.Items.Count-1;
  end;
  Endthread(0);
  ReceivedaThread:=0;
end;
这个在本窗口listview接收是没有问题的,现在在其他窗体上listview怎么样接收同样的数据?
我当时的想法是:
线程里的数据记录在一个结构体指针中,然后发消息到界面,界面发布消息解析指针,然后再往listview中写数据
if ThreadHandle<> 0 then
  postmessage(ThreadHandle,TH_MESSAGE,RECDATA,integer(listview1));
然后重载WNDPROC来接收,数据收不到
请问是我的想法出错了吗 如果错了那该怎么做? 请多指教!

------解决方案--------------------
postmessage要传的是 目标窗口的句柄。
另外,VCL非线程安全,子线程与主线程共访会有问题的。
------解决方案--------------------
其他窗体,你必须传入对象的句柄
------解决方案--------------------
你的ThreadHandle是线程的句柄啊。当然不能发送到窗体上了
------解决方案--------------------
PostThreadMessage
------解决方案--------------------
3楼说得对,你在线程参数里面保存窗体句柄,然后利用 postmessage 来发送消息;不过VCL在多线程的不安全性;最好加锁处理
------解决方案--------------------
if ThreadHandle<> 0 then
postmessage(ThreadHandle,TH_MESSAGE,RECDATA,integer());

假设我没理解错你这里的 TH_MESSAGE 是消息号、RECDATA 为结构体指针:
if ThreadHandle<> 0 then
postmessage(Handle{窗体的句柄},TH_MESSAGE,RECDATA,0);
然后,在接收的窗体通过 TH_MESSAGE 消息接收处理RECDATA,将数据写到listview1....

------解决方案--------------------
postmessage到主窗体,主窗体访问vcl,应该不需要加锁,因为主窗体的消息中处理代码是主进程的调用,与线程没有什么关系
------解决方案--------------------