通常在使用 Delphi/Lazarus 线程时,可以更改线程的优先级,以便它可以更快地执行。
也就是说,是否可以对 Indy10 TCP Server 组件做同样的事情?如果是这样,怎么做?这样做是否可取?
谢谢
通常在使用 Delphi/Lazarus 线程时,可以更改线程的优先级,以便它可以更快地执行。
也就是说,是否可以对 Indy10 TCP Server 组件做同样的事情?如果是这样,怎么做?这样做是否可取?
谢谢
TIdTCPServer
使用普通的 Delphi/Lazarus 线程。
如果您在 Windows 上运行,则可以调用 Win32 APIGetCurrentThread()
和SetThreadPriority()
函数。TThread
或者,您可以使用 Indy 的SetThreadPriority()
(Indy 9 及更早版本)或IndySetThreadPriority()
(Indy 10)功能设置对象的优先级。
如果您使用的是现代 Delphi 版本,则可以使用该TThread.CurrentThread
属性来获取TExternalThread
表示调用线程的对象。 TExternalThread
是TThread
后代,因此可以传递给IndySetThreadPriority()
,或者您可以直接设置TThread.Priority
属性。
如果你想直接访问 Indy 自己的TThread
对象,可以这样做,这取决于你使用的是哪个版本的 Indy:
如果您使用的是 Indy 9 和更早版本,则服务器事件会提供一个TIdPeerThread
对象指针。TIdPeerThread
是TThread
后代。很简单。
另一方面,如果您使用的是 Indy 10,它会竭尽全力隐藏/抽象您的线程。服务器事件现在提供一个TIdContext
对象指针,而TIdContext
不是线程本身。但一切都没有丢失。如果该TIdTCPServer.Scheduler
属性指向一个TIdSchedulerOfThread
派生组件(如果您不提供 a 则在内部TIdTCPServer
使用),那么您可以将该属性类型转换为一个对象指针,然后访问该属性,它是一个对象指针。 是后代。TIdSchedulerOfThreadDefault
Scheduler
TIdContext.Yarn
TIdYarnOfThread
TIdYarnOfthread.Thread
TIdThreadWithTask
TIdThreadWithTask
TThread