Witam, piszę program który ma pełnić rolę monitora systemowego. Znalazłem w książce pt "C++ Builder 5 Vademecum Profesjonalisty" przykład takiego programu. Program ten korzysta z Klucza HKEY_DYN_DATA, klucz ten jest przechowywany w pamięci RAM i są w nim przechowywane dane, które ulegają ciągłym zmianom (np. obciążenie procesora lub ilość odebranych bajtów przez kartę sieciową).
Kłopot w tym, że program ten prawdopodobnie poprawnie działać będzie jedynie w Win 9x, gdzie klucz ten jest, wydaje mi się, dostępny do wglądu. W edytorze regedit w Windows XP nie widać nawet drzewa tego klucza.
Czy jest jakaś inna metoda na odczytanie aktualnego obciążenia procesora?
Oto kod źródłowy aplikacji z książki (proszę nie zwracać uwagi na zmienne globalne, wkleiłem je z pliku nagłówkowego aby każdy widział co zawierają):
//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cgauges"
#pragma resource "*.dfm"
TForm1 *Form1;
const AnsiString
StartKey = "\\PrefStats\\StartStat",
DataKey = "\\PrefStats\\StatData",
StopKey = "\\PrefStats\\StopStat",
CPUUsage = "\\KERNEL\\CPUUsage",
BytesRec = "Dial-Up Adapter\\BytesRecvd",
BytesXmt = "Dial-Up Adapter\\ConnectSpeed",
ConnectSpeed = "Dial-Up Adapter\\ConnectSpeed",
PrefStatsDial =
"\\System\\CurrentControlSet\\control\PrefStats\\Enum\\Dial-Up Adapter",
PrefStatsKernel =
"\\System\\CurrentControlSet\\control\PrefStats\\Enum\\KERNEL";
long LastBytesXmt, LastBytesRec;
Tregistry *Reg1, *Reg2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
String name;
String temp1, temp2;
LastBytesRec=0;
LastBytesXmt=0;
Reg1=new TRegistry;
Reg1->RootKey=HKEY_DYN_DATA;
Reg2=new TRegistry;
Reg2->RootKey=HKEY_LOCAL_MACHINE;
temp1=PrefStatsKernel;
temp2=temp1+"\\CPUUsage";
if (Reg2->OpenKey(temp1, false)) {
name=Reg2->ReadString("Name");
}
Reg2->CloseKey();
if (Reg2->OpenKey(temp2, false)) {
Label1->Caption = name + ": " + Reg2->ReadString("Name");
}
Reg2->CloseKey();
temp1=PrefStatsDial;
if (Reg2->OpenKey(temp1, false)) {
name=Reg2->ReadString("Name");
}
Reg2->CloseKey();
temp2=temp1+"\\BytesRecvd";
if (Reg2->OpenKey(temp2, false)) {
Label2->Caption = name + ": " + Reg2->ReadString("Name");
}
Reg2->CloseKey();
temp2=temp1+"\\BytesXmit";
if (Reg2->OpenKey(temp2, false)) {
Label3->Caption = name + ": " + Reg2->ReadString("Name");
}
Reg2->CloseKey();
temp2=temp1+"\\ConnectSpeed";
if (Reg2->OpenKey(temp2, false)) {
Label4->Caption = name + ": " + Reg2->ReadString("Name");
}
Reg2->CloseKey();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
long CurBytesRec, CurBytesXmt;
CPUGauge->Progress = ReadDataFromReg(CPUUsage);
CurBytesRec=ReadDataFromReg(BytesRec);
RecvGauge->Progress=CurBytesRec-LastBytesRec;
Label9->Caption=FloatToStr(RecvGauge->Progress);
LastBytesRec=CurBytesRec;
CurBytesXmt=ReadDataFromReg(BytesXmt);
XmitGauge->Progress=CurBytesXmt-LastBytesXmt;
Label10->Caption=FloatToStr(XmitGauge->Progress);
LastBytesXmt=CurBytesXmt;
ConnectSpeedGauge->Progress=ReadDataFromReg(ConnectSpeed);
Label11->Caption=FloatToStr(ConnectSpeedGauge->Progress);
}
//---------------------------------------------------------------------------
long __fastcall TForm1::ReadDataFromReg(const AnsiString ObjectName)
{
Byte Buffer[4], Dummy[4];
long Bytes;
if (Reg1->OpenKey(StartKey, false)) {
Reg1->ReadBinaryData(ObjectName, Dummy, 4);
}
Reg1->CloseKey();
if (Reg1->OpenKey(DataKey, false)) {
Reg1->ReadBinaryData(ObjectName, Buffer, 4);
Bytes=(long)&Buffer;
}
Reg1->CloseKey();
if (Reg1->OpenKey(StopKey, false)) {
Reg1->ReadBinaryData(ObjectName, Dummy, 4);
}
Reg1->CloseKey();
return Bytes;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Reg1;
delete Reg2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowCPUUsageBarClick(TObject *Sender)
{
ShowCPUUsageBar->Checked = !ShowCPUUsageBar->Checked;
if (ShowCPUUsageBar->Checked) {
CPUBar->Visible=true;
} else {
CPUBar->Visible=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowReceivedBytesBarClick(TObject *Sender)
{
ShowReceivedBytesBar->Checked = !ShowReceivedBytesBar->Checked;
if (ShowReceivedBytesBar->Checked) {
RecvBar->Visible=true;
} else {
RecvBar->Visible=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowConnectionSpeedBarClick(TObject *Sender)
{
ShowConnectionSpeedBar->Checked = !ShowConnectionSpeedBar->Checked;
if (ShowConnectionSpeedBar->Checked) {
ConnectSpeedBar->Visible=true;
} else {
ConnectSpeedBar->Visible=false;
}
}
//---------------------------------------------------------------------------
</cpp>