【问题标题】:Setting TThread priority on Android在 Android 上设置线程优先级
【发布时间】:2014-06-02 20:45:04
【问题描述】:

我想更改 Android 上实时音频线程的优先级。 如果我将 TThread.Priority 设置为除 0 之外的任何值,我会得到一个异常:

EThread:线程错误:无效参数“

如何正确设置线程优先级?

【问题讨论】:

  • 文档清楚地解释了您会收到该错误的条件。
  • @BrodoFraggins:我在documentation 中没有看到这样的信息。

标签: android delphi


【解决方案1】:

在 POSIX 系统(如 Android)上,有一个 TThread.Policy 属性指定线程的调度策略,进而控制 TThread.Priority 属性的行为方式。您尝试为Priority 分配的值很可能在当前Policy 中没有意义。例如,SCHED_OTHERPolicy(默认值)仅支持 0 的 Priority,而 SCHED_FIFOSCHED_RRPolicy 支持 1-99 的 Priority(某些 POSIX系统甚至可能将它们限制为 32)。

因此,您必须先确保将Policy 设置为所需的策略,然后您可以根据需要更改Priority。但是请注意,某些Policy 值(例如SCHED_FIFOSCHED_RR)需要root/admin 权限才能更改其调度Priority

Embarcadero DocWiki 上没有记录这些信息,甚至没有 TThread.Policy 属性的存在。我查看了TThread 源代码,发现它使用POSIX pthread_getschedparam()pthread_setschedparam() 函数来获取/设置线程的PolicyPriority 值。然后我查看了这些函数的在线参考资料,例如this one。因此,在您的情况下,pthread_setschedparam() 因此错误而失败:

EINVAL policy is not a recognized policy, or param does not make sense for the policy.

【讨论】:

  • 我已经尝试了所有可用的策略组合和不同的优先级值。我发现了一个不同的问题,它说应该使用 setpriority。你知道如何从 Delphi 调用 setpriority 吗? [链接] (stackoverflow.com/questions/17398075/…)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多