diff --git a/mt/CThread.cpp b/mt/CThread.cpp index 9df33fb9..f67573fb 100644 --- a/mt/CThread.cpp +++ b/mt/CThread.cpp @@ -117,3 +117,18 @@ bool CThread::operator!=(const CThread& thread) const { return (m_rep != thread.m_rep); } + + +// +// CThreadMaskCancel +// + +CThreadMaskCancel::CThreadMaskCancel() : m_old(CThread::enableCancel(false)) +{ + // do nothing +} + +CThreadMaskCancel::~CThreadMaskCancel() +{ + CThread::enableCancel(m_old); +} diff --git a/mt/CThread.h b/mt/CThread.h index 982a1912..b6ebe1e3 100644 --- a/mt/CThread.h +++ b/mt/CThread.h @@ -125,8 +125,8 @@ private: // disables cancellation in the c'tor and enables it in the d'tor. class CThreadMaskCancel { public: - CThreadMaskCancel() : m_old(CThread::enableCancel(false)) { } - ~CThreadMaskCancel() { CThread::enableCancel(m_old); } + CThreadMaskCancel(); + ~CThreadMaskCancel(); private: bool m_old; diff --git a/mt/CThreadRep.cpp b/mt/CThreadRep.cpp index 4b2de42a..8b48f6b8 100644 --- a/mt/CThreadRep.cpp +++ b/mt/CThreadRep.cpp @@ -534,10 +534,21 @@ bool CThreadRep::wait(CThreadRep* target, double timeout) void CThreadRep::setPriority(int n) { + DWORD pClass = NORMAL_PRIORITY_CLASS; if (n < 0) { switch (-n) { case 1: n = THREAD_PRIORITY_ABOVE_NORMAL; break; - default: n = THREAD_PRIORITY_HIGHEST; break; + case 2: n = THREAD_PRIORITY_HIGHEST; break; + default: + pClass = HIGH_PRIORITY_CLASS; + switch (-n - 3) { + case 0: n = THREAD_PRIORITY_LOWEST; break; + case 1: n = THREAD_PRIORITY_BELOW_NORMAL; break; + case 2: n = THREAD_PRIORITY_NORMAL; break; + case 3: n = THREAD_PRIORITY_ABOVE_NORMAL; break; + default: n = THREAD_PRIORITY_HIGHEST; break; + } + break; } } else { @@ -548,6 +559,7 @@ void CThreadRep::setPriority(int n) default: n = THREAD_PRIORITY_IDLE; break; } } + SetPriorityClass(m_thread, pClass); SetThreadPriority(m_thread, n); }