Alterar a prioridade do thread de reforço no Windows

Eu estou tentando mudar a prioridade do thread no impulso, mas não estou tendo sorte. Estou recebendo um erro de identificador incorreto (tipo 6) da function GetLastError. Eu embora native_handle () retornou o identificador para o segmento?

Alguém sabe como fazer isto?

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 } 

editar: código final:

 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 } 

Use a function SetThreadPriority para definir a prioridade do segmento. SetPriorityClass é usado para definir a prioridade do processo. Você também precisa alterar os valores de prioridade, consulte a documentação do SetThreadPriority para obter detalhes.

A function SetPriorityClass toma como primeiro parâmetro um HANDLE, você está passando um ponteiro para um HANDLE. Altere para:

 res = SetPriorityClass(*th, REALTIME_PRIORITY_CLASS); 

ou algo equivalente. O kernel pode dizer que o valor do ponteiro que você passou não é realmente um identificador de thread válido porque eu acho que ele mantém uma lista interna de handles de thread atualmente alocadas. O ponteiro obviamente não está nessa lista. O compilador não pode realmente reforçar a segurança do tipo, já que um HANDLE é um tipo opaco – você só precisa ter muito cuidado com o que você passa.

Ah, a propósito, o outro comentarista Dani está correto, SetPriorityClass não é usado para definir a prioridade de um segmento, você quer usar SetThreadPriority qualquer maneira. Mas então meu conselho ainda estaria de pé, você precisa passar em uma mão, não um ponteiro para tal.