我试图改变提升中的线程优先级,但我没有运气。我从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
}
答案 0 :(得分:18)
使用SetThreadPriority函数设置线程优先级。 SetPriorityClass用于设置进程的优先级。您还必须更改优先级值,有关详细信息,请参阅SetThreadPriority的文档。
答案 1 :(得分:3)
SetPriorityClass
函数将第一个参数作为HANDLE,你传入一个指向HANDLE的指针。将其更改为:
res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS);
或类似的东西。内核可以告诉您传入的指针值实际上不是有效的线程句柄,因为我猜它维护了当前分配的线程句柄的内部列表。指针显然不在该列表中。编译器无法真正实现更好的类型安全性,因为HANDLE是一种不透明的类型 - 你只需要非常小心你传入的内容。
哦顺便说一句,其他评论者Dani是正确的,SetPriorityClass
不用于设置主题的优先级,你想要使用SetThreadPriority
。但是我的建议仍然存在,你需要传递一个HANDLE,而不是指向这样的指针。