Now using a QSemaphore to make the observer threads sleep. This allows waking up the threads immediately *without* having to poll the 'terminated' flag at short intervals.

This commit is contained in:
LoRd_MuldeR 2011-11-25 01:01:30 +01:00
parent fb53e209b5
commit 2243c77f4b
7 changed files with 22 additions and 28 deletions

View File

@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_MINOR_LO 4
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 3 #define VER_LAMEXP_PATCH 3
#define VER_LAMEXP_BUILD 786 #define VER_LAMEXP_BUILD 787
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Tool versions (minimum expected versions!) // Tool versions (minimum expected versions!)

View File

@ -33,7 +33,6 @@ typedef BOOL (WINAPI *GetSystemTimesPtr)(LPFILETIME lpIdleTime, LPFILETIME lpKer
CPUObserverThread::CPUObserverThread(void) CPUObserverThread::CPUObserverThread(void)
{ {
m_terminated = false;
} }
CPUObserverThread::~CPUObserverThread(void) CPUObserverThread::~CPUObserverThread(void)
@ -47,7 +46,6 @@ CPUObserverThread::~CPUObserverThread(void)
void CPUObserverThread::run(void) void CPUObserverThread::run(void)
{ {
qDebug("CPU observer started!"); qDebug("CPU observer started!");
m_terminated = false;
try try
{ {
@ -61,6 +59,8 @@ void CPUObserverThread::run(void)
FatalAppExit(0, L"Unhandeled exception error, application will exit!"); FatalAppExit(0, L"Unhandeled exception error, application will exit!");
TerminateProcess(GetCurrentProcess(), -1); TerminateProcess(GetCurrentProcess(), -1);
} }
while(m_semaphore.available()) m_semaphore.tryAcquire();
} }
ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime) ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
@ -94,7 +94,7 @@ void CPUObserverThread::observe(void)
sys[i] = 0; usr[i] = 0; idl[i] = 0; sys[i] = 0; usr[i] = 0; idl[i] = 0;
} }
while(!m_terminated) forever
{ {
if(getSystemTimes(&idlTime, &sysTime, &usrTime)) if(getSystemTimes(&idlTime, &sysTime, &usrTime))
{ {
@ -127,10 +127,7 @@ void CPUObserverThread::observe(void)
} }
} }
} }
for(int i = 0; i < 6; i++) if(m_semaphore.tryAcquire(1, 2000)) break;
{
if(!m_terminated) msleep(333);
}
} }
} }
else else

View File

@ -22,6 +22,7 @@
#pragma once #pragma once
#include <QThread> #include <QThread>
#include <QSemaphore>
class CPUObserverThread: public QThread class CPUObserverThread: public QThread
{ {
@ -31,7 +32,7 @@ public:
CPUObserverThread(void); CPUObserverThread(void);
~CPUObserverThread(void); ~CPUObserverThread(void);
void stop(void) { m_terminated = true; } void stop(void) { m_semaphore.release(); }
protected: protected:
void run(void); void run(void);
@ -41,6 +42,6 @@ signals:
void currentUsageChanged(const double usage); void currentUsageChanged(const double usage);
private: private:
volatile bool m_terminated; QSemaphore m_semaphore;
static inline unsigned __int64 filetime2ulonglong(const void *ftime); static inline unsigned __int64 filetime2ulonglong(const void *ftime);
}; };

View File

@ -35,7 +35,6 @@ DiskObserverThread::DiskObserverThread(const QString &path)
: :
m_path(makeRootDir(path)) m_path(makeRootDir(path))
{ {
m_terminated = false;
} }
DiskObserverThread::~DiskObserverThread(void) DiskObserverThread::~DiskObserverThread(void)
@ -49,7 +48,6 @@ DiskObserverThread::~DiskObserverThread(void)
void DiskObserverThread::run(void) void DiskObserverThread::run(void)
{ {
qDebug("DiskSpace observer started!"); qDebug("DiskSpace observer started!");
m_terminated = false;
try try
{ {
@ -63,6 +61,8 @@ void DiskObserverThread::run(void)
FatalAppExit(0, L"Unhandeled exception error, application will exit!"); FatalAppExit(0, L"Unhandeled exception error, application will exit!");
TerminateProcess(GetCurrentProcess(), -1); TerminateProcess(GetCurrentProcess(), -1);
} }
while(m_semaphore.available()) m_semaphore.tryAcquire();
} }
void DiskObserverThread::observe(void) void DiskObserverThread::observe(void)
@ -71,7 +71,7 @@ void DiskObserverThread::observe(void)
unsigned __int64 freeSpace, previousSpace = 0ui64; unsigned __int64 freeSpace, previousSpace = 0ui64;
bool ok = false; bool ok = false;
while(!m_terminated) forever
{ {
freeSpace = lamexp_free_diskspace(m_path, &ok); freeSpace = lamexp_free_diskspace(m_path, &ok);
if(ok) if(ok)
@ -88,10 +88,7 @@ void DiskObserverThread::observe(void)
previousSpace = freeSpace; previousSpace = freeSpace;
} }
} }
for(int i = 0; i < 6; i++) if(m_semaphore.tryAcquire(1, 2000)) break;
{
if(!m_terminated) msleep(333);
}
} }
} }

View File

@ -22,6 +22,7 @@
#pragma once #pragma once
#include <QThread> #include <QThread>
#include <QSemaphore>
class DiskObserverThread: public QThread class DiskObserverThread: public QThread
{ {
@ -31,7 +32,7 @@ public:
DiskObserverThread(const QString &path); DiskObserverThread(const QString &path);
~DiskObserverThread(void); ~DiskObserverThread(void);
void stop(void) { m_terminated = true; } void stop(void) { m_semaphore.release(); }
protected: protected:
void run(void); void run(void);
@ -44,6 +45,6 @@ signals:
void freeSpaceChanged(const quint64); void freeSpaceChanged(const quint64);
private: private:
volatile bool m_terminated; QSemaphore m_semaphore;
const QString m_path; const QString m_path;
}; };

View File

@ -30,7 +30,6 @@
RAMObserverThread::RAMObserverThread(void) RAMObserverThread::RAMObserverThread(void)
{ {
m_terminated = false;
} }
RAMObserverThread::~RAMObserverThread(void) RAMObserverThread::~RAMObserverThread(void)
@ -44,7 +43,6 @@ RAMObserverThread::~RAMObserverThread(void)
void RAMObserverThread::run(void) void RAMObserverThread::run(void)
{ {
qDebug("RAM observer started!"); qDebug("RAM observer started!");
m_terminated = false;
try try
{ {
@ -58,6 +56,8 @@ void RAMObserverThread::run(void)
FatalAppExit(0, L"Unhandeled exception error, application will exit!"); FatalAppExit(0, L"Unhandeled exception error, application will exit!");
TerminateProcess(GetCurrentProcess(), -1); TerminateProcess(GetCurrentProcess(), -1);
} }
while(m_semaphore.available()) m_semaphore.tryAcquire();
} }
void RAMObserverThread::observe(void) void RAMObserverThread::observe(void)
@ -65,7 +65,7 @@ void RAMObserverThread::observe(void)
MEMORYSTATUSEX memoryStatus; MEMORYSTATUSEX memoryStatus;
double previous = -1.0; double previous = -1.0;
while(!m_terminated) forever
{ {
memset(&memoryStatus, 0, sizeof(MEMORYSTATUSEX)); memset(&memoryStatus, 0, sizeof(MEMORYSTATUSEX));
memoryStatus.dwLength = sizeof(MEMORYSTATUSEX); memoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
@ -79,10 +79,7 @@ void RAMObserverThread::observe(void)
previous = current; previous = current;
} }
} }
for(int i = 0; i < 6; i++) if(m_semaphore.tryAcquire(1, 2000)) break;
{
if(!m_terminated) msleep(333);
}
} }
} }

View File

@ -22,6 +22,7 @@
#pragma once #pragma once
#include <QThread> #include <QThread>
#include <QSemaphore>
class RAMObserverThread: public QThread class RAMObserverThread: public QThread
{ {
@ -31,7 +32,7 @@ public:
RAMObserverThread(void); RAMObserverThread(void);
~RAMObserverThread(void); ~RAMObserverThread(void);
void stop(void) { m_terminated = true; } void stop(void) { m_semaphore.release(); }
protected: protected:
void run(void); void run(void);
@ -41,5 +42,5 @@ signals:
void currentUsageChanged(const double usage); void currentUsageChanged(const double usage);
private: private:
volatile bool m_terminated; QSemaphore m_semaphore;
}; };