当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何更改侦听器线程优先级》经验,为你挑选了2个好方法。

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

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

我可以改变这种行为吗?



1> Rob Kennedy..:

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

设置优先级别却可以让你的服务器似乎不太敏感,因为当一个连接到达时,线程监听这一方面将优先级较低的运行,将不能够连接上立即开展工作.在服务器开始处理请求之前,客户端必须等待一段时间.

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

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



2> mghie..:

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

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有