直接从线程向对象发送消息,而不使用主窗体

时间:2010-11-29 23:48:12

标签: multithreading delphi

我正在使用使用大量线程的第三方库。

我刚刚开始使用消息从一个线程回传给主线程。这一切都正常,但是使用SendMessage的方式我在下面描述似乎很麻烦,因为主窗体必须调度所有消息。有没有办法将消息直接发送到帧或对象,而不依赖于主要形式?

在程序启动时:

 MyMessageNumber1 :=  RegisterWindowMessage('MyUniqueID1');
 MyMessageNumber2 :=  RegisterWindowMessage('MyUniqueID2');

当发送没有任何数据的消息时,我这样做:

 SendMessage(Application.MainForm.Handle,  MyMessageNumber1) 

我的主要表格有:

procedure WndProc(var Message: TMessage); override;
if (Message.Msg = MyMessageNumber1)
  ... call a frame or other object's method that handles this particular message
else if (Message.Msg = MyMessageNumber2) then
  ... call another ....
else
  inherited;

总结:上面的WndProc必须知道的远比我更喜欢所有的消息以及派遣他们的人。

如何以任何对象可以接收的方式直接从线程发送消息?

所有这些消息都没有与之关联的数据。 (我们有一天会谈到这个!):-)

TIA

2 个答案:

答案 0 :(得分:4)

是的,你可以。您可以使用AllocateHWND在任何对象中分配窗口句柄。此句柄可用于向其发送消息。

但问题可能在于SendMessage。如果使用PostMessage而不是SendMessage,则调用将立即返回。 PostMessage不会等待处理消息。因此,如果您不需要消息结果,并且不需要发送对线程数据的引用,则可以使用PostMessage。

答案 1 :(得分:2)

其他表单和框架也有句柄,您可以在它们上定义消息处理方法,然后将消息直接发布到表单或框架。 (或控制,就此而言,如果您正在构建自己的自定义控件。)

有关设置消息处理方法的概述,请参阅http://docwiki.embarcadero.com/RADStudio/en/Declaring_a_New_Message-handling_Method