据我所知,delphi窗口都是单线程的,无论parent是mainform还是application,消息接收都是单线程的。也就是说,一个程序由始至终都是只能由一个线程处理消息。不过接收消息就是单线程,但处理接收到的消息内容你可以放在多线程里完成啊,这样可以在相当程度下实现每个线程自己处理自己的消息啦。有个delphi自带的控件,叫TApplicationEvents,放上去就可以自己写自己的消息处理啦,超级方便。哪用好像VC那么麻烦,而且实现的效果是和VC一样的。

解决方案 »

  1.   

    我的意思是用peekmessage创建自己的消息队列。可是我运行程序时出错,有没有成功的例子?
      

  2.   

    你说的是PostThreadMessage发送线程消息的吧?
    在接收线程中必须调用USER或GDI的函数才能建立消息队列。
    给你一个已经工作良好的例子:unit ClassNotifyCenter;{*******************************************************}
    {       Description:                                    }
    {               Notify Center    }
    {       Developper:                                     }
    {               Yao Yong                                }
    {       Release:                                        }
    {               2001-07-17                              }
    {*******************************************************}
    interfaceuses
      Classes,SysUtils,SyncObjs,Windows,Messages;type
      TNotifyProc = procedure (const Source:IDispatch) of object;
      TNotifyCenter = class(TThread)
      private
        FEventHandler: TNotifyProc;
      protected
        procedure Execute; override;
      public
        property OnEvent: TNotifyProc read FEventHandler write FEventHandler;
      end;implementation{ TNotifyCenter }procedure TNotifyCenter.Execute;
    var
      Msg: TMSG;
    begin
      repeat
        WaitMessage;
        GetMessage(Msg,0,0,0);
        if Msg.Message=WM_USER then
        begin
          if Assigned(FEventHandler) then
            FEventHandler(IDispatch(Msg.lParam));
          SetEvent(Msg.wParam);
        end;
      until Msg.Message=WM_QUIT;
    end;end.
      

  3.   

    我是用API,没有用 TThread。
      

  4.   


       消息队列,顾名思义是一个队列,实现了特定的队列存取规则,windows的消息队列也是如此,
       你要的是一个自定义消息队列,又何必用peekmessage来作一个跟系统相关的呢?而且会跟系统消息有冲突。   自定义消息队列可以用stringlist来实现,只是存取的时候要进行必要的同步!
      

  5.   

    to wyly,    WaitMessage;
        GetMessage(Msg,0,0,0);这些不都是API函数么?只有这两行才是关键,不知你是不是误解了?
        
      

  6.   

    to airhorse,
    我猜测你彻底混淆了“线程消息队列”与“窗口消息队列”,线程消息队列对于各个线程都是独立的,由系统维护,一般只用于各个线程间通信,哪里来的“系统消息”?既然是彼此独立的,何来“冲突”?
    其实线程消息队列与窗口消息队列是完全不同的概念,仅仅是实现的机制相同罢了。
      

  7.   

    各位,我再解释一下:我的意思是用 CreateThread创建一个thread,然后主线程发Postmessage,我的线程用PeekMessage收。发现主线程postmessage时报“线程消息队列没有创建”的错。可是在SDK HELP中说PeekMessage可以自动创建消息队列。(这是线程自己的消息队列,和什么系统消息队列什么的不相关的)
      

  8.   

    在用PeekMessage之前,用它自己来创建一个线程队列。
    PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
                                          ^^^no remove就是要创建队列
    是不是这原因  
      

  9.   

    唉,完来是用错API,不是用postmessage,应该用postthreadmessage
    eDRIVE(EncoreUneFois) 其实已经答了你的问题了,怪不得我回家试来试去都没事。
      

  10.   

    呵呵,给线程发消息使用PostThreadMessage,不是PostMessage
      

  11.   

    呵呵。我在帖子中写错了,应是postthreadmessage,我程序中用的也是postthreadmessage.
    是copy_paste(木石三) 对了