ROOT logo

From $ROOTSYS/tutorials/gui/CPUMeter.C


// Simple macro showing capabilities of TGSpeedo widget.
//Author: Bertrand Bellenot
   
#include "TSystem.h"
#include "TGFrame.h"
#include "TGWindow.h"
#include "TGSpeedo.h"

class TGShapedMain : public TGMainFrame {

protected:
   const TGPicture   *fBgnd;           // picture used as mask
   TGSpeedo          *fSpeedo;          // analog meter
   TTimer            *fTimer;           // update timer
   Int_t              fActInfo;         // actual information value

public:
   TGShapedMain(const TGWindow *p, int w, int h);
   virtual ~TGShapedMain();

   void              CloseWindow();
   TGSpeedo         *GetSpeedo() const { return fSpeedo; }
   Int_t             GetActInfo() const { return fActInfo; }
   void              ToggleInfos();

   ClassDef(TGShapedMain, 0)
};


// globals
TGShapedMain *gMainWindow;
TGSpeedo *gSpeedo;
Float_t prev_load;
Int_t old_memUsage;

//______________________________________________________________________________
TGShapedMain::TGShapedMain(const TGWindow *p, int w, int h) :
   TGMainFrame(p, w, h)
{
   // Constructor.

   fActInfo = 1;

   fSpeedo = new TGSpeedo(this, 0.0, 100.0, "CPU", "[%]");
   fSpeedo->Connect("OdoClicked()", "TGShapedMain", this, "ToggleInfos()");
   fSpeedo->Connect("LedClicked()", "TGShapedMain", this, "CloseWindow()");
   Connect("CloseWindow()", "TGShapedMain", this, "CloseWindow()");
   AddFrame(fSpeedo, new TGLayoutHints(kLHintsCenterX | kLHintsCenterX));
   fSpeedo->SetDisplayText("Used RAM", "[MB]");
   fTimer = new TTimer(100);
   fTimer->SetCommand("Update()");

   fBgnd = fSpeedo->GetPicture();
   gVirtualX->ShapeCombineMask(GetId(), 0, 0, fBgnd->GetMask());
   SetBackgroundPixmap(fBgnd->GetPicture());
   SetWMSizeHints(fBgnd->GetWidth(), fBgnd->GetHeight(), fBgnd->GetWidth(),
                  fBgnd->GetHeight(), 1, 1);

   MapSubwindows();
   MapWindow();
   // To avoid closing the window while TGSpeedo is drawing
   DontCallClose();
   // To avoid closing the window while TGSpeedo is drawing
   Resize(GetDefaultSize());
   // Set fixed size
   SetWMSizeHints(GetDefaultWidth(), GetDefaultHeight(), GetDefaultWidth(), 
                  GetDefaultHeight(), 1, 1);
   SetWindowName("ROOT CPU Load Meter");
   fTimer->TurnOn();   
}

//______________________________________________________________________________
void TGShapedMain::ToggleInfos()
{
   // Toggle information displayed in Analog Meter

   if (fActInfo < 2)
      fActInfo++;
   else
      fActInfo = 0;
   if (fActInfo == 0)
      fSpeedo->SetDisplayText("Total RAM", "[MB]");
   else if (fActInfo == 1)
      fSpeedo->SetDisplayText("Used RAM", "[MB]");
   else if (fActInfo == 2)
      fSpeedo->SetDisplayText("Free RAM", "[MB]");
}

//______________________________________________________________________________
TGShapedMain::~TGShapedMain()
{
   // Destructor.

   delete fTimer;
   delete fSpeedo;
}

//______________________________________________________________________________
void TGShapedMain::CloseWindow()
{
   // Close Window.

   if (fTimer)
      fTimer->TurnOff();
   DestroyWindow();
}

void Update()
{
   MemInfo_t memInfo;
   CpuInfo_t cpuInfo;
   Float_t act_load = 0.0;
   Int_t memUsage = 0;
   prev_load = act_load;
   old_memUsage = memUsage;

   // Get CPU informations
   gSystem->GetCpuInfo(&cpuInfo, 100);
   // actual CPU load
   act_load = cpuInfo.fTotal;
   // Get Memory informations
   gSystem->GetMemInfo(&memInfo);
   // choose which value to display
   if (gMainWindow->GetActInfo() == 0)
      memUsage = memInfo.fMemTotal;
   else if (gMainWindow->GetActInfo() == 1)
      memUsage = memInfo.fMemUsed;
   else if (gMainWindow->GetActInfo() == 2)
      memUsage = memInfo.fMemFree;
   // small threshold to avoid "trembling" needle
   if (fabs(act_load-prev_load) > 0.9) {
      gSpeedo->SetScaleValue(act_load, 10);
      prev_load = act_load;
   }
   // update only if value has changed
   if (memUsage != old_memUsage) {
      gSpeedo->SetOdoValue(memUsage);
      old_memUsage = memUsage;
   }
}

//______________________________________________________________________________
void CPUMeter()
{
   // Main application.

   gMainWindow = new TGShapedMain(gClient->GetRoot(), 500, 200);
   gSpeedo = gMainWindow->GetSpeedo();

   // set threshold values
   gSpeedo->SetThresholds(12.5, 50.0, 87.5);
   // set threshold colors
   gSpeedo->SetThresholdColors(TGSpeedo::kGreen, TGSpeedo::kOrange, 
                               TGSpeedo::kRed);
   // enable threshold
   gSpeedo->EnableThreshold();
   gSpeedo->SetScaleValue(0.0, 5);
   // enable peak marker
   gSpeedo->EnablePeakMark();

}

 CPUMeter.C:1
 CPUMeter.C:2
 CPUMeter.C:3
 CPUMeter.C:4
 CPUMeter.C:5
 CPUMeter.C:6
 CPUMeter.C:7
 CPUMeter.C:8
 CPUMeter.C:9
 CPUMeter.C:10
 CPUMeter.C:11
 CPUMeter.C:12
 CPUMeter.C:13
 CPUMeter.C:14
 CPUMeter.C:15
 CPUMeter.C:16
 CPUMeter.C:17
 CPUMeter.C:18
 CPUMeter.C:19
 CPUMeter.C:20
 CPUMeter.C:21
 CPUMeter.C:22
 CPUMeter.C:23
 CPUMeter.C:24
 CPUMeter.C:25
 CPUMeter.C:26
 CPUMeter.C:27
 CPUMeter.C:28
 CPUMeter.C:29
 CPUMeter.C:30
 CPUMeter.C:31
 CPUMeter.C:32
 CPUMeter.C:33
 CPUMeter.C:34
 CPUMeter.C:35
 CPUMeter.C:36
 CPUMeter.C:37
 CPUMeter.C:38
 CPUMeter.C:39
 CPUMeter.C:40
 CPUMeter.C:41
 CPUMeter.C:42
 CPUMeter.C:43
 CPUMeter.C:44
 CPUMeter.C:45
 CPUMeter.C:46
 CPUMeter.C:47
 CPUMeter.C:48
 CPUMeter.C:49
 CPUMeter.C:50
 CPUMeter.C:51
 CPUMeter.C:52
 CPUMeter.C:53
 CPUMeter.C:54
 CPUMeter.C:55
 CPUMeter.C:56
 CPUMeter.C:57
 CPUMeter.C:58
 CPUMeter.C:59
 CPUMeter.C:60
 CPUMeter.C:61
 CPUMeter.C:62
 CPUMeter.C:63
 CPUMeter.C:64
 CPUMeter.C:65
 CPUMeter.C:66
 CPUMeter.C:67
 CPUMeter.C:68
 CPUMeter.C:69
 CPUMeter.C:70
 CPUMeter.C:71
 CPUMeter.C:72
 CPUMeter.C:73
 CPUMeter.C:74
 CPUMeter.C:75
 CPUMeter.C:76
 CPUMeter.C:77
 CPUMeter.C:78
 CPUMeter.C:79
 CPUMeter.C:80
 CPUMeter.C:81
 CPUMeter.C:82
 CPUMeter.C:83
 CPUMeter.C:84
 CPUMeter.C:85
 CPUMeter.C:86
 CPUMeter.C:87
 CPUMeter.C:88
 CPUMeter.C:89
 CPUMeter.C:90
 CPUMeter.C:91
 CPUMeter.C:92
 CPUMeter.C:93
 CPUMeter.C:94
 CPUMeter.C:95
 CPUMeter.C:96
 CPUMeter.C:97
 CPUMeter.C:98
 CPUMeter.C:99
 CPUMeter.C:100
 CPUMeter.C:101
 CPUMeter.C:102
 CPUMeter.C:103
 CPUMeter.C:104
 CPUMeter.C:105
 CPUMeter.C:106
 CPUMeter.C:107
 CPUMeter.C:108
 CPUMeter.C:109
 CPUMeter.C:110
 CPUMeter.C:111
 CPUMeter.C:112
 CPUMeter.C:113
 CPUMeter.C:114
 CPUMeter.C:115
 CPUMeter.C:116
 CPUMeter.C:117
 CPUMeter.C:118
 CPUMeter.C:119
 CPUMeter.C:120
 CPUMeter.C:121
 CPUMeter.C:122
 CPUMeter.C:123
 CPUMeter.C:124
 CPUMeter.C:125
 CPUMeter.C:126
 CPUMeter.C:127
 CPUMeter.C:128
 CPUMeter.C:129
 CPUMeter.C:130
 CPUMeter.C:131
 CPUMeter.C:132
 CPUMeter.C:133
 CPUMeter.C:134
 CPUMeter.C:135
 CPUMeter.C:136
 CPUMeter.C:137
 CPUMeter.C:138
 CPUMeter.C:139
 CPUMeter.C:140
 CPUMeter.C:141
 CPUMeter.C:142
 CPUMeter.C:143
 CPUMeter.C:144
 CPUMeter.C:145
 CPUMeter.C:146
 CPUMeter.C:147
 CPUMeter.C:148
 CPUMeter.C:149
 CPUMeter.C:150
 CPUMeter.C:151
 CPUMeter.C:152
 CPUMeter.C:153
 CPUMeter.C:154
 CPUMeter.C:155
 CPUMeter.C:156
 CPUMeter.C:157
 CPUMeter.C:158
 CPUMeter.C:159
 CPUMeter.C:160
 CPUMeter.C:161
 CPUMeter.C:162
 CPUMeter.C:163
 CPUMeter.C:164
thumb