OSDN Git Service

Updated copyright year.
[lamexp/LameXP.git] / src / Thread_CPUObserver.cpp
index 99b0408..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>
 
+//Windows includes
+#define NOMINMAX
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+
 ////////////////////////////////////////////////////////////
 // Constructor & Destructor
 ////////////////////////////////////////////////////////////
 
 CPUObserverThread::CPUObserverThread(void)
 {
-       m_terminated = false;
 }
 
 CPUObserverThread::~CPUObserverThread(void)
@@ -44,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)
@@ -71,17 +85,17 @@ ULONGLONG CPUObserverThread::filetime2ulonglong(const void *ftime)
 
 void CPUObserverThread::observe(void)
 {
-       ULONGLONG sys[2], usr[2], idl[2];
-       FILETIME sysTime, usrTime, idlTime;
        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++)
        {
                sys[i] = 0; usr[i] = 0; idl[i] = 0;
        }
 
-       while(!m_terminated)
+       forever
        {
                if(GetSystemTimes(&idlTime, &sysTime, &usrTime))
                {
@@ -104,7 +118,7 @@ void CPUObserverThread::observe(void)
                        ULONGLONG timeSum = timeUsr + timeSys; //Overall CPU time that has elapsed
                        ULONGLONG timeWrk = timeSum - timeIdl; //Time the CPU spent working
 
-                       if((timeSum > 0) || (timeWrk > 0))
+                       if(timeSum > 0)
                        {
                                double current = static_cast<double>(timeWrk) / static_cast<double>(timeSum);
                                if(current != previous)
@@ -114,7 +128,8 @@ void CPUObserverThread::observe(void)
                                }
                        }
                }
-               msleep(1000);
+
+               if(m_semaphore.tryAcquire(1, 2000)) break;
        }
 }