【问题标题】:How to change Listener Thread Priority如何更改侦听器线程优先级
【发布时间】:2010-10-10 02:29:49
【问题描述】:

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

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

我可以改变这种行为吗?

【问题讨论】:

    标签: multithreading delphi indy thread-priority


    【解决方案1】:

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

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

    【讨论】:

    • 这看起来和我要找的完全一样。我必须等到明天才能测试它。我会在这里发表评论。还是谢谢!
    • +1 我刚刚测试过,效果很好!再次感谢您的帮助!
    【解决方案2】:

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

    设置较低的优先级实际上可能会使您的服务器看起来较少响应,因为当连接到达时,侦听该连接的线程将以较低的优先级运行并且将无法在连接上工作立即地。在您的服务器开始处理其请求之前,客户端将需要等待一段时间。

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

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

    【讨论】:

    • 嗨!好的,我必须更清楚一点:服务器有一个小的 GUI 部分应该保持响应。所以我想要的(感谢您指出这一点)是降低响应客户端请求而创建的线程的优先级......有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多