Страница 1 из 1

Как определить частоту процессора

Добавлено: 21 дек 2006, 12:31
MDCI
Здраствуйте!
Собственно нужно определить частоту процессора в одной программе.
Кто нибудь знает как это сделать (какие Api-функции или как-то по другому) ?
(На Vb или С++)

И еще какие спробы можно применить для контроля использования приложением процессора?

Re: Как определить частоту процессора

Добавлено: 21 дек 2006, 17:00
Absurd
Оно сохраняется в реестре.

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~MHz

Плюс, есть еще WinApi функция с очень контринтуитивным названием GetSystemInfo.

Re: Как определить частоту процессора

Добавлено: 21 дек 2006, 17:01
Absurd
mdci писал(а):И еще какие спробы можно применить для контроля использования приложением процессора?
Профайлер?

Re: Как определить частоту процессора

Добавлено: 21 дек 2006, 17:12
MDCI
Absurd писал(а):Профайлер?
Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.

Re: Как определить частоту процессора

Добавлено: 21 дек 2006, 17:50
Absurd
MDCI писал(а):Мне нужно чтобы программа занимала только определенное количество процессорного времени - например только 50%. Как мне кажется, с помощью таймера и функции Sleep.
Это зависит от специфики того что ты пишешь. В общем случае для таких вещей используют операционные системы реального времени (RTOS). Win32 к ним не относится. Но и в Win32 есть определенные фичи - например WM_IDLE и низкие приоритеты у треда. Приложение консольное/оконное ?

Re: Как определить частоту процессора

Добавлено: 22 дек 2006, 12:01
somewhere
Еще вариант замерить число тактов процеесора в секунду (частоту). Замерить число тактов выполнения основного алгоритма, а остальное число тактов: TranslateMessage, DispatchMessage.

Как определить частоту процессора

Добавлено: 28 дек 2006, 23:12
Gambler
Парни, я не силен в C++ но могу предложить 100% рабочий код на Delphi...

Держите:

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  stop : boolean;
implementation

uses Unit2;

{$R *.dfm}

function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo/(1000.0 * DelayTime);
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
Button1.Enabled := False;
Button2.Enabled := True;
Button2.Default:=true;
label1.Visible:=true;
Stop := False;
while not Stop do
begin
Label1.Caption := 'Скорость='+FloatToStr(GetCPUSpeed)+' MHz';
Application.ProcessMessages;
end;
Button1.Enabled := True;
Button2.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Stop:=true;
end;


end.

Re: Как определить частоту процессора

Добавлено: 29 дек 2006, 08:33
somewhere
&quot писал(а):dw 310Fh
Так и пиши - RDTSC - дельфи поймет, только вот на AMD такой инстукции кажеться нет.

Не забывай про TimerHi - за полсекунды процессор выполнит громадное число инструкции, так что это не 100% рабочий код, но 96-97% это точно