#ifndef Prozess_H
#define Prozess_H

#include "Betriebssystem.h"
#include "ReferenceCounter.h"

#ifdef WIN32
#    pragma comment(lib, "Psapi.lib")
#endif

namespace Framework
{
#ifdef WIN32
    struct MemoryInfo; //! aus dieser Datei
#endif
    class Prozess; //! aus dieser Datei

#ifdef WIN32
    struct MemoryInfo
    {
        unsigned long ausgelagerteFehler;
        __int64 hoechsteAusgelagerterSpeicher;
        __int64 ausgelagerterSpeicher;
        __int64 hoechsterAusgelagerterPool;
        __int64 ausgelagerterPool;
        __int64 hoechsterNichtAusgelagerterPool;
        __int64 nichtAusgelagerterPool;
        __int64 vorreservierterSpeicher;
        __int64 hoechsterVorreservierterSpeicher;
    };
#endif
    //! Diese Klasse findet informationen ueber einen laufenden Prozess heraus
    //! (CPU, MEM) Bei Ubuntu immer der eigene Prozess
    class Prozess : public virtual ReferenceCounter
    {
    private:
#ifdef WIN32
        int numProcessors;
        ULARGE_INTEGER lastCPU, lastSysCPU, lastUserCPU;
        void* pHandle;
#endif

    public:
        //! Konstruktor
        DLLEXPORT Prozess();
        //! nicht constant
#ifdef WIN32
        //! Setzt den Prozess, der ueberwacht werden soll (Nur fuer Windows)
        DLLEXPORT void setProcess(void* pHandle);
#endif
        //! Gibt den CPU verbrauch des Prozesses zurueck
        DLLEXPORT double getCPU() const;
        //! Gibt den Speicherverbrauch des Prozesses zurueck
        DLLEXPORT __int64 getMem() const;
#ifdef WIN32
        //! Gibt detailierte Informationen ueber den Speicherverbrauch des
        //! Prozesses zurueck (Nur fuer Windows)
        DLLEXPORT MemoryInfo getMemInfo() const;
        //! Gibt die Anzahl der Threads zurueck (Nur fuer Windows)
        DLLEXPORT int getThreadAnzahl() const;
#endif
    };
} // namespace Framework

#endif