如何更改监听器线程的优先级
-
09-09-2019 - |
题
我用印10的TIdCmdTCPServer部件实现我的客户机 - 服务器应用程序。问题是,来自客户端的请求可以是相当复杂的,我的服务器应用程序的GUI部分马上失去响应。从印文档,我得到的印:
创建并启动监听线程用于使用线程优先级tpHighest绑定。
我可以改变这种行为?
解决方案
正如罗布指出的那样,不改变侦听线程的优先级,降低工作线程的优先级来代替。它可以在的的onConnect()的处理程序访问的 TIdCmdTCPServer 实例,像这样:
procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
// sanity checks need to go here
TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
其他提示
设置的优先级监听线程不会解决你的问题更低。所有监听线程正在做的是听,是不是CPU密集型任务。直到连接到达时,该线程没有做任何事情。您可以确认,与喜欢的Process Explorer的工具;我认为它可以显示由线程CPU使用率。
设置优先级低实际上可能使你的服务器出现的少的响应,因为当一个连接到达时,线程监听这一方面将优先级较低的运行,将不能够连接上工作立即。客户端将在您的服务器开始处理其请求之前等待一段时间。
在请求不会在侦听线程处理。监听线程代表大部分的工作给其他线程。如果你只有一个TCP结合,那么你就只有一个监听线程,但你可以处理多个并发连接。各连接将由一个单独的线程尽管那里只有一个收听来处理。
无论如何,你可以通过处理服务器对象的OnBeforeListenerRun
事件更改优先级。它接收到代表听众线程TIdThread
的引用,所以你可以指定一个不同的值,其Priority
财产。此外,你的源代码,所以你可以去和改变tpListener
常量的定义的 IdGlobalCore.pas 的。该代码使用该值,而不是直接tpHighest
。
不隶属于 StackOverflow