OSDN Git Service

Updated copyright year.
[lamexp/LameXP.git] / src / Thread_CPUObserver.cpp
index 209f011..3768610 100644 (file)
@@ -1,11 +1,12 @@
 ///////////////////////////////////////////////////////////////////////////////
 // LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2020 LoRd_MuldeR <MuldeR2@GMX.de>
 //
 // This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
+// it under the terms of the GNU GENERAL PUBLIC LICENSE as published by
 // the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// (at your option) any later version; always including the non-optional
+// LAMEXP GNU GENERAL PUBLIC LICENSE ADDENDUM. See "License.txt" file!
 //
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // http://www.gnu.org/licenses/gpl-2.0.txt
 ///////////////////////////////////////////////////////////////////////////////
 
+//Internal
 #include "Thread_CPUObserver.h"
 #include "Global.h"
 
+//MUtils
+#include <MUtils/OSSupport.h>
+#include <MUtils/Exception.h>
+
+//Qt
 #include <QDir>
-#include <QLibrary>
 
-typedef BOOL (WINAPI *GetSystemTimesPtr)(LPFILETIME lpIdleTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
+//Windows includes
+#define NOMINMAX
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
 
 ////////////////////////////////////////////////////////////
 // Constructor & Destructor
@@ -33,7 +42,6 @@ typedef BOOL (WINAPI *GetSystemTimesPtr)(LPFILETIME lpIdleTime, LPFILETIME lpKer
 
 CPUObserverThread::CPUObserverThread(void)
 {
-       m_terminated = false;
 }
 
 CPUObserverThread::~CPUObserverThread(void)
@@ -47,20 +55,23 @@ CPUObserverThread::~CPUObserverThread(void)
 void CPUObserverThread::run(void)
 {
        qDebug("CPU observer started!");
-       m_terminated = false;
 
        try
        {
                observe();
        }
+       catch(const std::exception &error)
+       {
+               MUTILS_PRINT_ERROR("\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
+               MUtils::OS::fatal_exit(L"Unhandeled C++ exception error, application will exit!");
+       }
        catch(...)
        {
-               fflush(stdout);
-               fflush(stderr);
-               fprintf(stderr, "\nGURU MEDITATION !!!\n");
-               FatalAppExit(0, L"Unhandeled exception error, application will exit!");
-               TerminateProcess(GetCurrentProcess(), -1);
+               MUTILS_PRINT_ERROR("\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
+               MUtils::OS::fatal_exit(L"Unhandeled C++ exception error, application will exit!");
        }
+
+       while(m_semaphore.available()) m_semaphore.tryAcquire();
 }
 
 ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
@@ -74,65 +85,51 @@ ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
 
 void CPUObserverThread::observe(void)
 {
-       QLibrary kernel32("kernel32.dll");
-       GetSystemTimesPtr getSystemTimes = NULL;
+       bool first = true;
+       double previous = -1.0;
+       FILETIME sysTime, usrTime, idlTime;
+       ULONGLONG sys[2], usr[2], idl[2];
 
-       if(kernel32.load())
+       for(size_t i = 0; i < 2; i++)
        {
-               getSystemTimes = reinterpret_cast<GetSystemTimesPtr>(kernel32.resolve("GetSystemTimes"));
+               sys[i] = 0; usr[i] = 0; idl[i] = 0;
        }
 
-       if(getSystemTimes != NULL)
+       forever
        {
-               bool first = true;
-               double previous = -1.0;
-               FILETIME sysTime, usrTime, idlTime;
-               ULONGLONG sys[2], usr[2], idl[2];
-
-               for(size_t i = 0; i < 2; i++)
+               if(GetSystemTimes(&idlTime, &sysTime, &usrTime))
                {
-                       sys[i] = 0; usr[i] = 0; idl[i] = 0;
-               }
+                       sys[1] = sys[0]; sys[0] = filetime2ulonglong(&sysTime);
+                       usr[1] = usr[0]; usr[0] = filetime2ulonglong(&usrTime);
+                       idl[1] = idl[0]; idl[0] = filetime2ulonglong(&idlTime);
 
-               while(!m_terminated)
-               {
-                       if(getSystemTimes(&idlTime, &sysTime, &usrTime))
+                       if(first)
                        {
-                               sys[1] = sys[0]; sys[0] = filetime2ulonglong(&sysTime);
-                               usr[1] = usr[0]; usr[0] = filetime2ulonglong(&usrTime);
-                               idl[1] = idl[0]; idl[0] = filetime2ulonglong(&idlTime);
-
-                               if(first)
-                               {
-                                       first = false;
-                                       emit currentUsageChanged(1.0);
-                                       msleep(250);
-                                       continue;
-                               }
+                               first = false;
+                               emit currentUsageChanged(1.0);
+                               msleep(250);
+                               continue;
+                       }
 
-                               ULONGLONG timeIdl = (idl[0] - idl[1]); //Idle time only
-                               ULONGLONG timeSys = (sys[0] - sys[1]); //Kernel mode time (incl. Idle time!)
-                               ULONGLONG timeUsr = (usr[0] - usr[1]); //User mode time only
+                       ULONGLONG timeIdl = (idl[0] - idl[1]); //Idle time only
+                       ULONGLONG timeSys = (sys[0] - sys[1]); //Kernel mode time (incl. Idle time!)
+                       ULONGLONG timeUsr = (usr[0] - usr[1]); //User mode time only
                                
-                               ULONGLONG timeSum = timeUsr + timeSys; //Overall CPU time that has elapsed
-                               ULONGLONG timeWrk = timeSum - timeIdl; //Time the CPU spent working
+                       ULONGLONG timeSum = timeUsr + timeSys; //Overall CPU time that has elapsed
+                       ULONGLONG timeWrk = timeSum - timeIdl; //Time the CPU spent working
 
-                               if(timeSum > 0)
+                       if(timeSum > 0)
+                       {
+                               double current = static_cast<double>(timeWrk) / static_cast<double>(timeSum);
+                               if(current != previous)
                                {
-                                       double current = static_cast<double>(timeWrk) / static_cast<double>(timeSum);
-                                       if(current != previous)
-                                       {
-                                               emit currentUsageChanged(current);
-                                               previous = current;
-                                       }
+                                       emit currentUsageChanged(current);
+                                       previous = current;
                                }
                        }
-                       msleep(1000);
                }
-       }
-       else
-       {
-               qWarning("GetSystemTimes() ist not available on this system!");
+
+               if(m_semaphore.tryAcquire(1, 2000)) break;
        }
 }