如何在Delphi中使用多个线程设计请求处理?

时间:2013-06-28 09:16:17

标签: sql-server delphi windows-services

我是多线程应用程序的架构和设计的新手。

如何设计以下案例,如果存在任何设计模式,则更为出色。

我们需要设计一个可以执行以下操作的Windows服务。

SQL Server数据库有两个名为Organization and Events的表,它分别保存组织列表和该组织中发生的事件列表。

Windows服务需要异步处理每个组织的事件。 Windows服务从组织表中读取组织列表,并为每个组织创建一个线程。每个组织线程,每2秒轮询一次事件表,将事件读入事件列表。当在事件列表中放置/可用某些内容时,必须调用另一个对象(调度程序),并且调度程序对象创建并运行事件处理程序线程来处理这些事件中的每一个。处理完事件后,应终止事件处理程序线程。

可以有多个事件来源将事件放在事件列表中。

使用Delphi 2009和SQL Server 2008 Express版。

请帮忙。

1 个答案:

答案 0 :(得分:3)

为什么要为每个组织创建一个帖子?我能想到的唯一原因是您希望能够为每个组织配置不同的轮询时间。否则,我只有一个轮询线程可以获取自上次轮询以来的所有事件并处理这些事件。

为了处理事件,您可以使用队列和工作池来处理它们(查看OmnithreadLibrary,以便处理事件(这可能很耗时,我不知道) ,可以是多线程的。

如果您愿意,可以确保每个组织只同时处理一个事件,尽管您应该想知道这是否有意义。

所以,我会:

  • 1轮询线程以获取新事件并将它们放入队列中。
  • 处理这些事件的队列。
  • 处理队列的任意数量的工作者,最好是基于cpu核心数而不是组织数。

如果您需要在整个组织中进行事件消息传递,您可能还需要查看RabbitMQ之类的工具。获取事件并立即将它们放入RabbitMQ可能是一个好主意,之后该工具可以分发它们。