我已經實現了一個啓動了幾個工作線程的windows xp服務應用程序。 從我需要發送自定義消息回服務的線程之一。 我該怎麼做?我如何將自定義消息發送到Windows服務?
回答
感謝您的幫助。這裏是我解決了這個問題:
在服務類定義:
WHandle: HWND;
protected
procedure HandleServiceMessage(var Msg: TMessage); virtual;
在ServiceExecute方法:
WHandle := AllocateHWnd(HandleServiceMessage);
MyThread := TMyThread.Create(true);
MyThread.HndMain := WHandle;
MyThread.Resume;
while not Terminated do ServiceThread.ProcessRequests(True);
DeallocateHWnd(WHandle);
end;
在ServiceStop方法:
MyThread.Terminate;
而處理信息的方法:
procedure TMessageService.HandleServiceMessage(var Msg : TMessage);
var
Handled: Boolean;
begin
Handled := True;
if Msg.Msg = WM_MYMESSAGE then
Beep
else
Handled := False;
if Handled then
Msg.Result := 0
else
Msg.Result := DefWindowProc(WHandle, Msg.Msg, Msg.WParam, Msg.LParam);
end;
在MyThread.Execute方法:
PostMessage(HndMain,WM_MYMESSAGE,0,0);
它的工作就好了。
一個選項是使用OmniThreadLibrary(例如,閱讀this blog post)。
我同意TOndrej共享對象應該是足夠的。
另一方面,您可以使用我的IPC(Cromis IPC),它在服務內部工作得很好。它很容易使用,面向消息,所以你不需要知道命名管道的工作方式和速度。服務器部分也使用線程池,因此不需要等待某些內容被處理。您可以使用消防和忘記方案。
或者如果您認爲有一點重新設計是可以的,您可以嘗試OmniThreadLibrary,它具有已經構建的所有消息傳遞,並且用於執行這樣的任務。
編輯:
好了可能是最清晰的路要走,沒有任何redesing是具有由臨界區保護的通用對象列表。工作線程正在添加需要在列表中處理的對象。當添加對象時,工作線程發出事件信號。然後你有一個對象處理線程正在等待WaitForSingleObject這個事件。只要有東西添加到列表中,事件就會發出信號,處理線程會處理它在列表中找到的所有對象。然後它再次等待。您只需保護對公共列表的訪問權限即可。
簡化代碼應該是這樣的:
工作者線程
ObjectList.Add(MessageObject);
SetEvent(FEvent);
處理線程
while not Terminated do
begin
WaitForSingleObjest(FEvent, INFINITE);
// process all the objects
end;
創建僅郵件窗口:
procedure TMyService.MessageQueueDispatch(var Message: TMessage);
begin
Dispatch(Message); //Delphi default dispatcher for TMyService
end;
procedure TMyService.SomeKindOfOnCreate;
begin
MessageQueue := AllocateHWnd(MessageQueueDispatch);
end;
毀:
procedure TMyService.SomeKindOfDestroy;
begin
CloseHandle(MessageQueue);
end;
現在,您可以處理的消息,就像您用郵件的形式做:
TMyService = class(TService)
...
protected
procedure HandleMyMessage(var msg: TMsg); message WM_MY_MESSAGE;
end;
德爾福調度()處理程序將調用函數的照顧。
AlloocateHWnd()不是線程安全的,不應該在主線程之外調用。 TService改爲在自己的工作線程中運行。 – 2010-10-08 18:01:41
- 1. 將自定義WCF消息發送到服務
- 2. 發送Windows消息到Windows服務
- 3. 發送自定義消息Azure的服務總線
- 4. 如何將自定義命令發送到服務c#
- 5. 如何將自定義命令從.NET代碼發送到.NET Windows服務?
- 6. 如何發送消息給服務?
- 7. 如何將消息發送到服務激活器的鏈中
- 8. 如何使用服務將消息發送到多個號碼?
- 9. 如何將HttpPost消息發送到MRDS的Drive服務
- 10. 將消息從沙盒發送到自定義應用程序
- 11. 自定義協議不發送消息
- 12. Windows:將消息發送到父窗口?
- 13. 使用Windows窗體發送自定義命令到服務
- 14. UNet不發送消息到服務器
- 15. Node.js發送消息到GCM服務器
- 16. 通過網頁發送消息到windows服務
- 17. 如何使用JMS將預定消息發送到Azure服務總線
- 18. 我如何發送消息?
- 19. 發送自定義窗口消息...自定義數據編組
- 20. 如何在發送JMS消息或發送到特定服務器之前按消息類型過濾?
- 21. 如何將WM_CHAR消息發送到Firefox
- 22. 如何將驗證消息添加到我的自定義HtmlHelper?
- 23. bpmn服務任務如何將消息發送到WSO2中的WSO2 ESB BPS
- 24. 如何將Windows消息發送到非主窗體
- 25. 如何確保發送到openfire服務器的XMPP消息?
- 26. Java ActiveMQ:如何發送消息從客戶端到服務器
- 27. 如何知道消息是否從iPhone發送到服務器?
- 28. 如何獲取消息從服務器發送到Android
- 29. 如何發送消息從服務器到客戶端流星?
- 30. 如何將消息發送到TOPIC然後發送到MDB?
您的工作線程是您的服務應用程序的一部分,因此您不清楚您要做什麼。我的印象是,你需要在線程之間傳遞一些數據,這可以通過簡單地保持對數據結構的引用並鎖定線程安全來完成。根據您的意圖,主服務線程可能更容易輪詢工作線程的狀態。你能提供更多細節嗎? – 2010-10-08 11:32:56
我會盡力解釋更好。我的服務應用程序在其OnStart事件中創建兩個線程。它還創建一個對象列表(對象有自己的功能和屬性)。現在,兩個線程之一輪詢串行端口以獲取新數據,並且需要將這些數據(或超時)發送給對象列表中的一個對象,但是我需要在不中斷其執行的情況下執行此操作。所以,當串行端口上的數據可用時,我想將消息發佈到主服務線程。這個主要的服務線程可以將數據發送給對象。 – zoomz 2010-10-08 11:45:00
我明白,一個可能的解決方案是在服務類中創建一個僅消息窗口,但我不完全知道如何去做。 – zoomz 2010-10-08 11:52:16