我正在使用使用大量线程的第三方库。
我刚刚开始使用消息从一个线程回传给主线程。这一切都正常,但是使用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
答案 0 :(得分:4)
是的,你可以。您可以使用AllocateHWND在任何对象中分配窗口句柄。此句柄可用于向其发送消息。
但问题可能在于SendMessage。如果使用PostMessage而不是SendMessage,则调用将立即返回。 PostMessage不会等待处理消息。因此,如果您不需要消息结果,并且不需要发送对线程数据的引用,则可以使用PostMessage。
答案 1 :(得分:2)
其他表单和框架也有句柄,您可以在它们上定义消息处理方法,然后将消息直接发布到表单或框架。 (或控制,就此而言,如果您正在构建自己的自定义控件。)
有关设置消息处理方法的概述,请参阅http://docwiki.embarcadero.com/RADStudio/en/Declaring_a_New_Message-handling_Method。