0

通常在使用 Delphi/Lazarus 线程时,可以更改线程的优先级,以便它可以更快地执行。

也就是说,是否可以对 Indy10 TCP Server 组件做同样的事情?如果是这样,怎么做?这样做是否可取?

谢谢

4

1 回答 1

2

TIdTCPServer使用普通的 Delphi/Lazarus 线程。

如果您在 Windows 上运行,则可以调用 Win32 APIGetCurrentThread()SetThreadPriority()函数。TThread或者,您可以使用 Indy 的SetThreadPriority()(Indy 9 及更早版本)或IndySetThreadPriority()(Indy 10)功能设置对象的优先级。

如果您使用的是现代 Delphi 版本,则可以使用该TThread.CurrentThread属性来获取TExternalThread表示调用线程的对象。 TExternalThreadTThread后代,因此可以传递给IndySetThreadPriority(),或者您可以直接设置TThread.Priority属性。

如果你想直接访问 Indy 自己的TThread对象,可以这样做,这取决于你使用的是哪个版本的 Indy:

如果您使用的是 Indy 9 和更早版本,则服务器事件会提供一个TIdPeerThread对象指针。TIdPeerThreadTThread后代。很简单。

另一方面,如果您使用的是 Indy 10,它会竭尽全力隐藏/抽象您的线程。服务器事件现在提供一个TIdContext对象指针,而TIdContext不是线程本身。但一切都没有丢失。如果该TIdTCPServer.Scheduler属性指向一个TIdSchedulerOfThread派生组件(如果您不提供 a 则在内部TIdTCPServer使用),那么您可以将该属性类型转换为一个对象指针,然后访问该属性,它是一个对象指针。 是后代。TIdSchedulerOfThreadDefaultSchedulerTIdContext.YarnTIdYarnOfThreadTIdYarnOfthread.ThreadTIdThreadWithTaskTIdThreadWithTaskTThread

于 2012-09-13T21:14:39.637 回答