【问题标题】:Change boost thread priority in Windows在 Windows 中更改提升线程优先级
【发布时间】:2010-10-10 17:20:27
【问题描述】:

我正在尝试更改 boost 中的线程优先级,但我没有运气。我从 GetLastError 函数中收到错误的句柄错误(类型 6)。我虽然 native_handle() 返回了线程的句柄?

有人知道怎么做吗?

void baseThread::applyPriority(uint8 priority)
{

#ifdef WIN32
    if (!m_pThread)
        return;

    BOOL res;
    HANDLE th = m_pThread->native_handle();

    switch (priority)
    {
    case REALTIME   : res = SetPriorityClass(th, REALTIME_PRIORITY_CLASS);      break;
    case HIGH       : res = SetPriorityClass(th, HIGH_PRIORITY_CLASS);          break;
    case ABOVE_NORMAL   : res = SetPriorityClass(th, ABOVE_NORMAL_PRIORITY_CLASS);  break;
    case NORMAL     : res = SetPriorityClass(th, NORMAL_PRIORITY_CLASS);            break;
    case BELOW_NORMAL   : res = SetPriorityClass(th, BELOW_NORMAL_PRIORITY_CLASS);  break;
    case IDLE       : res = SetPriorityClass(th, IDLE_PRIORITY_CLASS);          break;
    }

    if (res == FALSE)
    {
        int err = GetLastError();
    }

#endif
}

编辑:最终代码:

void baseThread::applyPriority(uint8 priority)
{

#ifdef WIN32
    if (!m_pThread)
        return;

    BOOL res;
    HANDLE th = m_pThread->native_handle();

    switch (priority)
    {
    case REALTIME       : res = SetThreadPriority(th, THREAD_PRIORITY_TIME_CRITICAL);   break;
    case HIGH           : res = SetThreadPriority(th, THREAD_PRIORITY_HIGHEST);         break;
    case ABOVE_NORMAL   : res = SetThreadPriority(th, THREAD_PRIORITY_ABOVE_NORMAL);    break;
    case NORMAL         : res = SetThreadPriority(th, THREAD_PRIORITY_NORMAL);          break;
    case BELOW_NORMAL   : res = SetThreadPriority(th, THREAD_PRIORITY_BELOW_NORMAL);    break;
    case IDLE           : res = SetThreadPriority(th, THREAD_PRIORITY_LOWEST);          break;
    }

#endif
}

【问题讨论】:

    标签: c++ windows multithreading winapi boost


    【解决方案1】:

    使用SetThreadPriority 函数设置线程优先级。 SetPriorityClass 用于设置进程的优先级。您还必须更改优先级值,有关详细信息,请参阅SetThreadPriority 的文档。

    【讨论】:

      【解决方案2】:

      SetPriorityClass 函数的第一个参数是 HANDLE,您传递的是指向 HANDLE 的指针。将其更改为:

      res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
      

      或类似的东西。内核可以判断您传入的指针值实际上不是有效的线程句柄,因为我猜它维护了当前分配的线程句柄的内部列表。指针显然不在该列表中。编译器并不能真正实现更好的类型安全,因为 HANDLE 是一种不透明的类型——你只需要非常小心你传入的内容。

      对了,另一位评论者 Dani 是对的,SetPriorityClass 不是用来设置线程优先级的,你还是要用SetThreadPriority。但是我的建议仍然有效,您需要传入一个 HANDLE,而不是指向此类的指针。

      【讨论】:

      • 指针问题是我事先弄乱了代码而不是修复它。但是感谢您的帮助。 :P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多