2010-11-29 30 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

相關問題