如何更改侦听器线程优先级

时间:2009-02-26 14:50:48

标签: multithreading delphi indy thread-priority

我使用Indy 10的TIdCmdTCPServer组件来实现我的客户端 - 服务器应用程序。问题是来自客户端的请求可能相当复杂,并且我的服务器应用程序的GUI部分立即失去响应能力。从Indy Documentation开始,我得到了Indy:

  

使用线程优先级tpHighest为Bindings创建和启动侦听器线程。

我可以改变这种行为吗?

2 个答案:

答案 0 :(得分:6)

为侦听线程设置较低的优先级并不能解决您的问题。所有侦听器线程正在进行侦听,这不是CPU密集型任务。在连接到达之前,该线程根本没有做任何事情。您可以使用Process Explorer之类的工具进行确认;我认为它可以通过线程显示CPU使用情况。

设置优先级可能实际上使您的服务器显示 less 响应,因为当连接到达时,侦听该连接的线程将以较低优先级运行,并且将无法处理连接立即。在服务器开始处理请求之前,客户端必须等待一段时间。

请求不在侦听器线程中处理。侦听器线程将大部分工作委托给其他线程。如果您只有一个TCP绑定,那么您将只有一个侦听器线程,但您可以处理许多并发连接。尽管只有一个监听器,但每个连接都将由一个单独的线程处理。

无论如何,您可以通过处理服务器对象的OnBeforeListenerRun事件来更改优先级。它接收对表示侦听器线程的TIdThread的引用,因此您可以为其Priority属性分配不同的值。此外,您还拥有源代码,因此您可以进入并更改 IdGlobalCore.pas tpListener常量的定义。代码使用该值,而不是直接使用tpHighest

答案 1 :(得分:6)

正如Rob指出的那样,不要改变侦听器线程的优先级,而是降低工作线程的优先级。它可以在 TIdCmdTCPServer 实例的 OnConnect()处理程序中访问,如下所示:

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;