Logo ROOT   6.10/09
Reference Guide
CPUMeter.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_gui
3 /// Simple macro showing capabilities of the TGSpeedo widget.
4 ///
5 /// \macro_code
6 ///
7 /// \author Bertrand Bellenot
8 
9 #include "TSystem.h"
10 #include "TGFrame.h"
11 #include "TGWindow.h"
12 #include "TGSpeedo.h"
13 
14 class TGShapedMain : public TGMainFrame {
15 
16 protected:
17  const TGPicture *fBgnd; // picture used as mask
18  TGSpeedo *fSpeedo; // analog meter
19  TTimer *fTimer; // update timer
20  Int_t fActInfo; // actual information value
21 
22 public:
23  TGShapedMain(const TGWindow *p, int w, int h);
24  virtual ~TGShapedMain();
25 
26  void CloseWindow();
27  TGSpeedo *GetSpeedo() const { return fSpeedo; }
28  Int_t GetActInfo() const { return fActInfo; }
29  void ToggleInfos();
30 
31  ClassDef(TGShapedMain, 0)
32 };
33 
34 
35 // globals
36 TGShapedMain *gMainWindow;
37 TGSpeedo *gSpeedo;
38 Float_t prev_load;
39 Int_t old_memUsage;
40 
41 //______________________________________________________________________________
42 TGShapedMain::TGShapedMain(const TGWindow *p, int w, int h) :
43  TGMainFrame(p, w, h)
44 {
45  // Constructor.
46 
47  fActInfo = 1;
48 
49  fSpeedo = new TGSpeedo(this, 0.0, 100.0, "CPU", "[%]");
50  fSpeedo->Connect("OdoClicked()", "TGShapedMain", this, "ToggleInfos()");
51  fSpeedo->Connect("LedClicked()", "TGShapedMain", this, "CloseWindow()");
52  Connect("CloseWindow()", "TGShapedMain", this, "CloseWindow()");
53  AddFrame(fSpeedo, new TGLayoutHints(kLHintsCenterX | kLHintsCenterX));
54  fSpeedo->SetDisplayText("Used RAM", "[MB]");
55  fTimer = new TTimer(100);
56  fTimer->SetCommand("Update()");
57 
58  fBgnd = fSpeedo->GetPicture();
59  gVirtualX->ShapeCombineMask(GetId(), 0, 0, fBgnd->GetMask());
60  SetBackgroundPixmap(fBgnd->GetPicture());
61  SetWMSizeHints(fBgnd->GetWidth(), fBgnd->GetHeight(), fBgnd->GetWidth(),
62  fBgnd->GetHeight(), 1, 1);
63 
64  MapSubwindows();
65  MapWindow();
66  // To avoid closing the window while TGSpeedo is drawing
67  DontCallClose();
68  // To avoid closing the window while TGSpeedo is drawing
69  Resize(GetDefaultSize());
70  // Set fixed size
71  SetWMSizeHints(GetDefaultWidth(), GetDefaultHeight(), GetDefaultWidth(),
72  GetDefaultHeight(), 1, 1);
73  SetWindowName("ROOT CPU Load Meter");
74  fTimer->TurnOn();
75 }
76 
77 //______________________________________________________________________________
78 void TGShapedMain::ToggleInfos()
79 {
80  // Toggle information displayed in Analog Meter
81 
82  if (fActInfo < 2)
83  fActInfo++;
84  else
85  fActInfo = 0;
86  if (fActInfo == 0)
87  fSpeedo->SetDisplayText("Total RAM", "[MB]");
88  else if (fActInfo == 1)
89  fSpeedo->SetDisplayText("Used RAM", "[MB]");
90  else if (fActInfo == 2)
91  fSpeedo->SetDisplayText("Free RAM", "[MB]");
92 }
93 
94 //______________________________________________________________________________
95 TGShapedMain::~TGShapedMain()
96 {
97  // Destructor.
98 
99  delete fTimer;
100  delete fSpeedo;
101 }
102 
103 //______________________________________________________________________________
104 void TGShapedMain::CloseWindow()
105 {
106  // Close Window.
107 
108  if (fTimer)
109  fTimer->TurnOff();
110  DestroyWindow();
111 }
112 
113 void Update()
114 {
115  MemInfo_t memInfo;
116  CpuInfo_t cpuInfo;
117  Float_t act_load = 0.0;
118  Int_t memUsage = 0;
119  prev_load = act_load;
120  old_memUsage = memUsage;
121 
122  // Get CPU information
123  gSystem->GetCpuInfo(&cpuInfo, 100);
124  // actual CPU load
125  act_load = cpuInfo.fTotal;
126  // Get Memory information
127  gSystem->GetMemInfo(&memInfo);
128  // choose which value to display
129  if (gMainWindow->GetActInfo() == 0)
130  memUsage = memInfo.fMemTotal;
131  else if (gMainWindow->GetActInfo() == 1)
132  memUsage = memInfo.fMemUsed;
133  else if (gMainWindow->GetActInfo() == 2)
134  memUsage = memInfo.fMemFree;
135  // small threshold to avoid "trembling" needle
136  if (fabs(act_load-prev_load) > 0.9) {
137  gSpeedo->SetScaleValue(act_load, 10);
138  prev_load = act_load;
139  }
140  // update only if value has changed
141  if (memUsage != old_memUsage) {
142  gSpeedo->SetOdoValue(memUsage);
143  old_memUsage = memUsage;
144  }
145 }
146 
147 //______________________________________________________________________________
148 void CPUMeter()
149 {
150  // Main application.
151 
152  gMainWindow = new TGShapedMain(gClient->GetRoot(), 500, 200);
153  gSpeedo = gMainWindow->GetSpeedo();
154 
155  // set threshold values
156  gSpeedo->SetThresholds(12.5, 50.0, 87.5);
157  // set threshold colors
158  gSpeedo->SetThresholdColors(TGSpeedo::kGreen, TGSpeedo::kOrange,
160  // enable threshold
161  gSpeedo->EnableThreshold();
162  gSpeedo->SetScaleValue(0.0, 5);
163  // enable peak marker
164  gSpeedo->EnablePeakMark();
165 
166 }
167 
Int_t fMemFree
Definition: TSystem.h:183
virtual int GetCpuInfo(CpuInfo_t *info, Int_t sampleTime=1000) const
Returns cpu load average and load info into the CpuInfo_t structure.
Definition: TSystem.cxx:2445
float Float_t
Definition: RtypesCore.h:53
TH1 * h
Definition: legend2.C:5
#define gClient
Definition: TGClient.h:166
virtual int GetMemInfo(MemInfo_t *info) const
Returns ram and swap memory usage info into the MemInfo_t structure.
Definition: TSystem.cxx:2455
int Int_t
Definition: RtypesCore.h:41
#define ClassDef(name, id)
Definition: Rtypes.h:297
void SetOdoValue(Int_t val)
Set actual value of odo meter.
Definition: TGSpeedo.cxx:306
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
void SetScaleValue(Float_t val)
Set actual scale (needle position) value.
Definition: TGSpeedo.cxx:365
R__EXTERN TSystem * gSystem
Definition: TSystem.h:539
virtual void CloseWindow()
Close and delete main frame.
Definition: TGFrame.cxx:1728
Handles synchronous and a-synchronous timer events.
Definition: TTimer.h:51
#define gVirtualX
Definition: TVirtualX.h:350
Int_t fMemTotal
Definition: TSystem.h:181
Int_t fMemUsed
Definition: TSystem.h:182
Float_t fTotal
Definition: TSystem.h:172