|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
НАСЧЕТ ТЕМПЕРАТУРЫ И ЗАГРУЖЕННОСТИ...
я конечно понимаю что эти темы уже есть по отдельности но я там не нашел понятного ответа на эти вопросы. думаю эта тема будет многим интересна т.к. я блин уже давольно долго не могу найти ответы на эти вопросы в нете...еще просьба не отвечать типа температуру камня мона считать в реестре с hkey dyn data предварительно включив с4етчик startstat - пробовал, давольно долго мучился и ничего не получил
З.Ы. кто знает просьба писать с пояснениями)) |
#2
|
||||
|
||||
Вот почитай тут или тут на русском языке. Больше ничего найти не смог.
Программирование - это искусство и наш смысл жизни. |
#3
|
|||
|
|||
в русской инфе насчет температуры ни... не понял - но папробую разобрацца))) за инфу спасиба
|
#4
|
|||
|
|||
нащел рабочий пример получения загруза камня:
Код:
const SystemBasicInformation = 0; SystemPerformanceInformation = 2; SystemTimeInformation = 3; type TPDWord = ^DWORD; TSystem_Basic_Information = packed record dwUnknown1: DWORD; uKeMaximumIncrement: ULONG; uPageSize: ULONG; uMmNumberOfPhysicalPages: ULONG; uMmLowestPhysicalPage: ULONG; uMmHighestPhysicalPage: ULONG; uAllocationGranularity: ULONG; pLowestUserAddress: Pointer; pMmHighestUserAddress: Pointer; uKeActiveProcessors: ULONG; bKeNumberProcessors: byte; bUnknown2: byte; wUnknown3: word; end; type TSystem_Performance_Information = packed record liIdleTime: LARGE_INTEGER; {LARGE_INTEGER} dwSpare: array[0..75] of DWORD; end; type TSystem_Time_Information = packed record liKeBootTime: LARGE_INTEGER; liKeSystemTime: LARGE_INTEGER; liExpTimeZoneBias: LARGE_INTEGER; uCurrentTimeZoneId: ULONG; dwReserved: DWORD; end; var NtQuerySystemInformation: function(infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: TPDword): DWORD; stdcall = nil; liOldIdleTime: LARGE_INTEGER = (); liOldSystemTime: LARGE_INTEGER = (); function Li2Double(x: LARGE_INTEGER): Double; begin Result := x.HighPart * 4.294967296E9 + x.LowPart end; procedure GetCPUUsage; var SysBaseInfo: TSystem_Basic_Information; SysPerfInfo: TSystem_Performance_Information; SysTimeInfo: TSystem_Time_Information; status: Longint; {long} dbSystemTime: Double; dbIdleTime: Double; bLoopAborted : boolean; begin if @NtQuerySystemInformation = nil then NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation'); // get number of processors in the system status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); if status <> 0 then Exit; // Show some information with SysBaseInfo do begin ShowMessage( Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13+ 'uMmNumberOfPhysicalPages: %d'+#13+'uMmLowestPhysicalPage: %d'+#13+ 'uMmHighestPhysicalPage: %d'+#13+'uAllocationGranularity: %d'#13+ 'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d', [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages, uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity, uKeActiveProcessors, bKeNumberProcessors])); end; bLoopAborted := False; while not bLoopAborted do begin // get new system time status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0); if status <> 0 then Exit; // get new CPU's idle time status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); if status <> 0 then Exit; // if it's a first call - skip it if (liOldIdleTime.QuadPart <> 0) then begin // CurrentValue = NewValue - OldValue dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); // CurrentCpuIdle = IdleTime / SystemTime dbIdleTime := dbIdleTime / dbSystemTime; // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5; // Show Percentage Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime); Application.ProcessMessages; // Abort if user pressed ESC or Application is terminated bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated; end; // store new CPU's idle and system time liOldIdleTime := SysPerfInfo.liIdleTime; liOldSystemTime := SysTimeInfo.liKeSystemTime; // wait one second Sleep(1000); end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetCPUUsage end; Последний раз редактировалось Admin, 22.02.2009 в 12:46. |
#5
|
|||
|
|||
Цитата:
Хотелось бы программно вытащить информацию о температуре процессора и использовать ее при формировании управляющего сигнала для изменения скорости вращения вентилятора кулера. В линке на русском слишком много ограничений - там не работает, это не тестировал и т.д. Тем не менее, существует много программ (например, SpeedFan), которые выводят температуру в разных точках и кучу других параметров компа вне зависимости от изготовителя комплектующих. Найти бы адресок исходника такого продукта! Помогите! |
#6
|
||||
|
||||
http://www.xard.ru/post/10920/default.asp
Там правда на С++, но на Delphi переносится элементарно. Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#7
|
|||
|
|||
[quote=zip000]http://www.xard.ru/post/10920/default.asp
Там правда на С++, но на Delphi переносится элементарно.[/Q] Спасибо за ссылку. На Delphi, наверное, переносится элементарно, но не с моим уровнем... Решил вопрос проще - поставил терморезистор. Все остальное - дело техники. Последний раз редактировалось cadil, 12.02.2008 в 13:40. |
#8
|
|||
|
|||
Помогите перевеси код из С++ в делфи. Так же не могу найти примеров кода для снятия показаний датчиков температуры, тут хоть для с++ есть осталось тока первести но я с++ не знаю вообще : ) ХЕЛП!
|
#9
|
|||
|
|||
Цитата:
Код:
int indexPort = 0x295; int dataPort = 0x296; Теперь напишем функцию, возвращающую содержимое регистра SuperIO чипа по его индексу. int ListenPort(int index) { PortOut(indexPort, index); return PortIn(dataPort); } Также нам понадобится функция, записывающая некоторое значение в регистр SuperIO чипа по его индексу. void SendPort(int index, int data) { PortOut(indexPort, index); PortOut(dataPort, data); } Полагаем, что приведенный код абсолютно понятен и в комментариях не нуждается. Теперь мы можем разработать функцию, возвращающую показание термодатчика. В качестве параметра функции передается его номер (смотри Листинг 1). int getTemp(int TempNum) { int TempPort; if (TempNum == 1) { TempPort = 0x29; } else { if (TempNum == 2) { TempPort = 0x2A; } else { if (TempNum == 3) { TempPort = 0x2B; } } } return ListenPort(TempPort); } Последний раз редактировалось Admin, 22.02.2009 в 12:47. |
#10
|
||||
|
||||
Перевод
Вот перевод:
Код:
uses io; const indexPort:word = $295; dataPort:word = $296; function ListenPort(index:byte):byte; begin PortOut(indexPort, index); Result := PortIn(dataPort); end; procedure SendPort(index:byte; data:byte); begin PortOut(indexPort, index); PortOut(dataPort, data); end; function getTemp(TempNum:byte):byte; begin if TempNum=1 then Result := ListenPort($29) else if TempNum=2 then Result := ListenPort($2A) else if TempNum=3 then Result := ListenPort($2B) else Result := 0; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage ( IntToStr(getTemp(1)) ); end; Заголовочный файл io.pas и библиотека io.dll в архиве. P.S. ВАЖНО: Если функции экспортируемые из io.dll не указывать как stdcall то возможны ошибки, вплоть до вылета на синий экран смерти (Как это было у меня) Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 22.02.2009 в 15:00. |
#11
|
|||
|
|||
файл IO.dcu не найден
|
#12
|
|||
|
|||
в общем совместными услилиями решили это дело !
для ITF 8712f адерса 29,2A,2B для w83627DHG адреса 27,50,51 незнаю как делать теги поэтому прилагаю файл с кодом в текстовом файле : ) Научите теги писать что бы код прятать ?! так же в архиве ответы на вапросы как установить IO.dll и сама io.dll Проверено лично на материнской плате ASUS p5b deluxe каторая имеет w83627DHG показания первого и второго датчика совпали с показаниями программы ЭВЕРЕСТ , третий датчик показывал от 0 до 128 причина в том что он не задействован : ) Возникают проблемы при использовании на микросхемах w83627HF , читается только показания первого датчика(северный мост).Остальные не тестировал, по всей видимости надо обращатся в первый банк а не нулевой а как это сделать низнаю : ) Последний раз редактировалось ControlFreak, 23.02.2009 в 11:45. |
#13
|
|||
|
|||
Конкретно тег код писать так:
поскольку написать тег я не могу, он сразу превратится в поле, я буду писать вместо знака [ знак { {code} {/code} |
#14
|
|||
|
|||
Код:
uses io; var indexPort:integer = $295; dataPort:integer = $296; tempport:integer; function ListenPort(index:integer):integer; begin PortOut(indexPort, index); Result := PortIn(dataPort); end; procedure SendPort(index,data:integer); begin PortOut(indexPort, index); PortOut(dataPort, data); end; function getTemp(TempNum:integer):integer; begin if TempNum=1 then tempport:=$27 else if TempNum=2 then tempport:=$50 else if TempNum=3 then tempport:=$51 ; Result :=listenport(tempport); end; procedure TForm1.Timer1Timer(Sender: TObject); begin label1.Caption := ( IntToStr(getTemp(1)) ); label2.Caption := ( IntToStr(getTemp(2)) ); label3.Caption := ( IntToStr(getTemp(3)) ); |
#15
|
||||
|
||||
Анализируя статью http://www.xard.ru/post/10920/default.asp попытался сделать информацию о скорости вращения кулеров, но столкнулся с проблемой-неправильным результатом при вычислениях. Вот код на си:
Код:
int getRPM(int FanNum) { int divisor, FanCount, counter; divisor = ListenPort(0x0B); if (FanNum == 1) {divisor = divisor & 0x07; FanCount = ListenPort(0x0D);} else { if (FanNum == 2) {divisor = (divisor & 0x38) >> 3; FanCount = ListenPort(0x0E);} else { if (FanNum == 3) {divisor = divisor & 0x40; FanCount = ListenPort(0x0F);}}} if (divisor == 0) {counter = 1; if (FanNum == 3) counter = 2;} else { if (divisor == 1) {counter = 2;} else { if (divisor == 2) {counter = 4;} else { if (divisor == 3) {counter = 8;} else { if (divisor == 4) {counter = 16;} else { if (divisor == 5) {counter = 32;} else { if (divisor == 6) {counter = 64;} else { if (divisor == 7) {counter = 128;} else { if (divisor == 64) {counter = 8;}}}}}}}}} if (FanCount == -1 || FanCount == 0) {return 0;} else return 1350000/(counter*FanCount); } Вот мой перевод на delphi: Код:
function getFan(FanNum:integer):extended; var divisor, FanCount, counter:integer; begin divisor:=0;FanCount:=0;counter:=0; divisor:=ListenPort($0B); if FanNum=1 then begin divisor:=divisor and ListenPort($07); FanCount:=ListenPort($0D); end else if FanNum=2 then begin divisor:=(divisor and ListenPort($38)) shr 3; FanCount:= ListenPort($0E); end else if FanNum=3 then begin divisor:= divisor and ListenPort($40); FanCount:= ListenPort($0F); end; if divisor=0 then begin counter:= 1; if (FanNum=3) then counter:= 2; end else if divisor=1 then counter:=2 else if divisor=2 then counter:=4 else if divisor=3 then counter:=8 else if divisor=4 then counter:=16 else if divisor=5 then counter:=32 else if divisor=6 then counter:=64 else if divisor=7 then counter:=128 else if divisor=64 then counter:=8; if (FanCount=-1) or (FanCount=0) then Result:=0 else Result:=1350000/(counter*FanCount); end; Может кто знает в чем дело? Выдает по 22500, 540000 RPM, в действительности же Аида выдает ~2450 Последний раз редактировалось mixael, 02.06.2010 в 19:25. |