2013-06-28 77 views
2

我是新興的多線程應用程序的體系結構和設計。如何設計在Delphi中使用多線程處理請求?

我該如何設計下面的案例,如果存在任何設計模式,那就更好了。

我們需要設計一個可以執行以下操作的windows服務。

SQL Server數據庫有兩個表稱爲組織和事件表,其中分別包含在該組織中發生的組織列表和事件列表。

Windows服務需要異步處理每個組織的事件。 Windows服務從組織表中讀取組織列表併爲每個組織創建一個線程。每個組織線程每兩秒輪詢事件表將事件讀入事件列表。另一個對象(調度程序)必須在Event列表中放置/可用時調用,並且調度程序對象創建並運行事件處理程序線程來處理每個事件。一旦事件被處理,事件處理程序線程應該被終止。

可以有事件的多個來源將事件放入事件列表中。

使用Delphi 2009和SQL Server 2008 Express版本。

請幫忙。

+1

爲什麼需要如此多的「組織」線程,如果他們所做的只是輪詢?一個輪詢線程將是足夠恕我直言。 – mjn

+0

我也會考慮提供一種方法來在事件插入時通知服務:通過IPC或TCP或UDP或HTTP或命名管道或郵槽,COM +,MSMQ ... –

回答

3

爲什麼要爲每個組織創建一個線程?我能想到的唯一原因是您希望能夠爲每個組織配置不同的輪詢時間。否則,我只有一個輪詢線程可以獲取自上次輪詢以來的所有事件並處理這些事件。

爲了處理事件,你可以使用一個隊列和工人對它們進行處理池(在OmnithreadLibrary看看,所以處理事件(可能是耗時的,我不知道),可以。多線程

如果你願意,你可以確保每個組織只有一個事件被同時處理,但你應該不知道這是否有道理可言

所以,我會:

  • 1輪詢線程獲取新事件並將它們放入一個隊列。
  • 1隊列用於處理這些事件。
  • 處理隊列的任何數量的工人,最好基於cpu核心數量而不是組織數量。

如果您需要在整個組織中完成事件消息傳遞,那麼您可能還需要查看諸如RabbitMQ之類的工具。獲取事件並立即將它們放入RabbitMQ可能是一個好主意,之後該工具可以分發它們。

+0

+1用於提示RabbitMQ – mjn

相關問題