2010-11-29 31 views
3

我正在使用使用大量线程的第三方库。直接从一个线程发送消息到一个对象而不使用主窗体

我刚开始使用消息从线程回传给主线程。这一切都工作,但使用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

我发现很难接受WndProc能够知道太多消息的想法。处理消息是WndProc的**作业**。 – 2010-11-30 01:24:47

+0

#Rob Kennedy - 但是如果WndProc是主要的形式(因为我认为是必要的,因此这个问题),那么主表单就必须知道低级代码的各种细节,以便它可以发送消息给它们。为什么主表单需要知道一些低级代码的内部细节,正如梅森指出的那样,低级代码可以明确地捕获这些信息? – RobertFrank 2010-11-30 23:31:45

回答

4

当然可以。您可以使用AllocateHWND在任何对象中分配窗口句柄。这个句柄可以用来发送消息。

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

+1

我看到有人低估了这个回应。这可能是因为您不需要为已经有句柄的Frame或其他WinControl创建句柄。但是,如果您希望*任何对象*能够接收消息,则需要为该对象提供句柄。 – GolezTrol 2010-11-30 00:27:41

相关问题