Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Осциллограф, отображающий тактовую частоту(SOS)


Автор: ForFreedom 1.8.2009, 15:30
Помогите доработать программу, нужно чтобы она реалтайм отображала тактовую частоту процессора и строила график(как осциллограф), 
я дошел до того, что у меня фиксируется текущее значение и строится график по двум точкам.
Мой код: 
#include <vcl.h>
#pragma hdrstop
#include "Unit5.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Chart"
#pragma link "Series"
#pragma link "TeEngine"
#pragma link "TeeProcs"
#pragma resource "*.dfm"
TForm5 *Form5;
//---------------------------------------------------------------------------
__fastcall TForm5::TForm5(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
double CPUSpeed(void)
  {
    DWORD dwTimerHi, dwTimerLo; 
    asm
     { 
        DW 0x310F
        mov dwTimerLo, EAX
        mov dwTimerHi, EDX
      }
    Sleep (500); 
    asm
     { 
        DW 0x310F 
        sub EAX, dwTimerLo 
        sub EDX, dwTimerHi 
        mov dwTimerLo, EAX 
        mov dwTimerHi, EDX
     } 
    return dwTimerLo/(1000.0*500); 
  }
//---------------------------------------------------------------------------
void __fastcall TForm5::Button1Click(TObject *Sender)
{
Edit1->Text = FloatToStr(CPUSpeed());
for(int i=0;i<31;i++)
{
 Series1->AddXY(i,CPUSpeed(),"",clRed);
}
}

Автор: sawfish 3.8.2009, 11:55
Ваш вопрос непонятен...
Насколько видно из кода, Вы выводите 31 точку по нажатию на кнопку.
Цитата

нужно чтобы она реалтайм отображала тактовую частоту процессора 

На сколько реалтайм?

Могу предложить такой вариант: по таймеру каждую секунду вызывается Ваша функция CPUSpeed и значение выводится в графике.
Сначала набирается 20 значений, потом последние 20 показываются (здесь можете сделать как угодно).
На форме Chart и Timer. У таймера интервал 1000мс. В Chart'е Series типа LineSeries, для нее в закладке General выставлена галочка DateTime. У Chart'а LeftAxis->Automatic=false.

Код

//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
    Series1->Clear();
    Chart1->BottomAxis->DateTimeFormat="hh:nn:ss";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if (Series1->Count()==20)                           // если следующая точка будет 21-я
        Series1->Delete(0);                             // удаление первой точки
    Series1->AddXY(Now(), CPUSpeed(), "", clRed);
    double dMin=Series1->MinYValue();
    double dMax=Series1->MaxYValue();
    double dPer=(dMax-dMin)*0.1;
    Chart1->LeftAxis->SetMinMax(dMin-dPer, dMax+dPer);
}
//---------------------------------------------------------------------------


Получается вот так:

user posted image

Автор: ForFreedom 8.8.2009, 12:59
Спасибо огромное.  А как мне теперь сделать, чтобы пользователь задавал интервал таймера?

Автор: hente 8.8.2009, 13:06
 smile свойста таймера смотри smile 

Автор: Romikgy 8.8.2009, 13:07
Timer1->Interval 
меняй 

Автор: ForFreedom 8.8.2009, 13:12
Дак мне нужно эту фичу в интерфейс включить, чтобы пользователь реалтайм регулировал интервал...

Автор: sawfish 8.8.2009, 18:43
На форму (или в отдельное окно) Edit или MaskEdit, рядом кнопочку Применить, по нажатию и выставляете нужный интервал.

Автор: ForFreedom 9.8.2009, 07:00
Спасибо!

Автор: p486 24.8.2009, 15:39
а в чем смысл? тактовая частота ЦП меняется только у ноутбуков! и к ним идут спец. программы которые позволяют управлять этим процессом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)