procedure TMyClient.Execute;
var
  msg: TMsg;
begin
  PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);//创建线程消息队列
  while not Terminated do
  begin
    while PeekMessage(msg, 0, 0, 0,PM_REMOVE) do    //取出放入msg中,并删除这个消息
      //do something 
  end;
end;

解决方案 »

  1.   

    一个较完整的示例
    先定义:
    const
      WM_Mymessage= WM_User+200; 主窗体中
    if haswarn[IDDisplay] then
      begin
        PostThreadMessage(Thread[IDDisplay].threadID,WM_clearwarn,0,0);
        ……
        exit;
      end;
    线程中:
       if PeekMessage(MyMsg,0,0,0,PM_REMOVE) then
            begin    
                if (MyMsg.message = WM_QUIT) then
                    Terminate      //处理myThread.terminate;
                else
                    if MyMsg.message = WM_Mymessage then
                    begin        //处理自定义的消息。
                        SetStatus(threadID,4,true);
                        cnt := false;
                    end;
            end;
      

  2.   

    更正,上面的WM_clearwarn应为WM_Mymessage 
      

  3.   

    谢谢你们的回答,已经搞定了.
    再问一个问题
    TranslateMessage(Msg); DispatchMessage(Msg);两个连用,有什么用处
      

  4.   

    Peekmessage() 从消息队列中读消息
    Getmessage() 可以有选择的从消息列表中得到消息
    DispatchMessage() 用来派送消息到窗口过程
    TranslateMessage() 用于将Virtul-Key消息翻译为字符消息
    Postthreadmessage() 用于向线程发送消息
    Postmessage() 用于将消息传送到窗口的消息队列
      

  5.   

    谢谢copy_paste(木石三) 
    能说dispatchMessage的实际作用吗?通常用在哪?请指点
      

  6.   

    procedure TMyClient.Execute;
    var
      msg: TMsg;
    begin
      PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);//创建线程消息队列
      while not Terminated do
      begin
        while PeekMessage(msg, 0, 0, 0,PM_REMOVE) do    //取出放入msg中,并删除这个消息
          if (msg.message= 我自定义的消息) then //由PostThreadMessage发过来的
          begin
            //作相应处理。  
          end else
            DispatchMessage(msg);//交由Windows处理分配给指定的窗口(msg.hwnd确定),你可以看一下Application.ProcessMessage 
      end;
    end; 
      

  7.   

    我看了,它里面也就是这样写的
    TranslateMessage(MSG)
    DispatchMessage(MSG)
    因为给我的感觉是已经处理了消息,为什么再DispatchMessage???
      

  8.   

    你看我这样理解对不对?
    通过DispatchMessage,把消息发给窗口过程,让指定的窗口处理消息,不然的话,消息将丢失
      

  9.   

    差不多是这样,一般消息都有返回值,TMsg(msg).Result,DispatchMessage发送给各窗体的消息到了最后面(没有inherited),都会调用API:CallWindowProc(名称好像是这个),肚中无货了,再说,我只能帮你up
      

  10.   

    非常感谢copy_paste(木石三)