Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2007, 21:02   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Сообщение определить тактовою частоту процессора и узнать название активной видеокарты и объём памяти

1. Как определить тактовою частоту процессора?
Какими функциями пользоваться?

2. Как узнать название активной видеокарты и обЪём памяти?
SalasAndriy вне форума Ответить с цитированием
Старый 02.11.2007, 07:25   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

На мучайся... код реально работает... C++ Builder 6.0


Код:
#include <vcl.h>
#pragma hdrstop

#include <dos.h>
#include <math.h>
#include <setupapi.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

  /////////////////////////////////
  // Описание функции измерения частоты процессора
  double GetCPUSpeed()
  {
     int DelayTime = 500;

     DWORD TimerHi, TimerLo;
     int PriorityClass, Priority;

     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
     }

     Sleep(DelayTime);

     asm {
     dw 310Fh
     sub eax, TimerLo
     sbb edx, TimerHi
     mov TimerLo, eax
     mov TimerHi, edx
     }

     SetThreadPriority(GetCurrentThread, Priority);
     SetPriorityClass(GetCurrentProcess, PriorityClass);

     return (TimerLo/(1000.0 * DelayTime));
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

  /////////////////////////////////
  // Создание файла "init.log"

  FILE *F;
  if ((F = fopen("init.log", "wt")) == NULL)
  {
ShowMessage("Не удалось создать файл ""init.log"" !");
return;
  }

  /////////////////////////////////
  // Информация о текущей дате

  struct date d;
  getdate(&d);

  fprintf(F,"Дата: %d.%d.%d \n",d.da_day,d.da_mon,d.da_year);

  /////////////////////////////////
  // Информация о частоте процессора

  fprintf(F,"\n");
  fprintf(F,"Частота процессора: %f МГц \n",GetCPUSpeed());

  /////////////////////////////////
  // Информация об оперативной памяти

  fprintf(F,"\n");
  fprintf(F,"[Информация об оперативной памяти]\n");
  MEMORYSTATUS MemStat;
  GlobalMemoryStatus(&MemStat);
  fprintf(F,"Физической памяти всего: %i Мб \n",MemStat.dwTotalPhys/1024/1024);
  fprintf(F,"Физической памяти доступно: %i Мб \n",MemStat.dwAvailPhys/1024/1024);
  fprintf(F,"Виртуальной памяти всего: %i Мб \n",MemStat.dwTotalVirtual/1024/1024);
  fprintf(F,"Виртуальной памяти доступно: %i Мб \n",MemStat.dwAvailVirtual/1024/1024);

  /////////////////////////////////
  // Информация о жестких дисках

  fprintf(F,"\n");
  fprintf(F,"[Информация о жестких дисках]\n");
  fprintf(F,"Объем диска С: %s байт / %s Мб\n",IntToStr(DiskSize(3)),IntToStr(DiskSize(3)/1048576));
  fprintf(F,"Свободно на диске С: %s байт / %s Мб\n",IntToStr(DiskFree(3)),IntToStr(DiskFree(3)/1048576));
  if(DiskSize(4)== -1)
  {
  }
     else
     {
     fprintf(F,"Объем диска D: %s байт / %s Мб\n",IntToStr(DiskSize(4)),IntToStr(DiskSize(4)/1048576));
     fprintf(F,"Свободно на диске D: %s байт / %s Мб\n",IntToStr(DiskFree(4)),IntToStr(DiskFree(4)/1048576));
     }
  if(DiskSize(5)== -1)
  {
  }
     else
     {
     fprintf(F,"Объем диска E: %s байт / %s Мб\n",IntToStr(DiskSize(5)),IntToStr(DiskSize(5)/1048576));
     fprintf(F,"Свободно на диске E: %s байт / %s Мб\n",IntToStr(DiskFree(5)),IntToStr(DiskFree(5)/1048576));
     }
  if(DiskSize(6)== -1)
  {
  }
     else
     {
     fprintf(F,"Объем диска F: %s байт / %s Мб\n",IntToStr(DiskSize(6)),IntToStr(DiskSize(6)/1048576));
     fprintf(F,"Свободно на диске F: %s байт / %s Мб\n",IntToStr(DiskFree(6)),IntToStr(DiskFree(6)/1048576));
     }

Последний раз редактировалось merax; 02.11.2007 в 08:19.
merax вне форума Ответить с цитированием
Старый 02.11.2007, 07:26   #3
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Код:
 
  Информация о видеокарте

  TDisplayDevice lpDisplayDevice;
  DWORD dwFlags;
  DWORD cc;

  lpDisplayDevice.cb = sizeof(lpDisplayDevice);
  dwFlags = 0;
  cc = 0;

  EnumDisplayDevices(NULL,cc,&lpDisplayDevice,dwFlags);

  fprintf(F,"\n");
  fprintf(F,"[Информация о видеокарте]\n");
  fprintf(F,"%s\n",lpDisplayDevice.DeviceString);
  fprintf(F,"Объем видеопамяти: %i Мб \n",lpDisplayDevice.StateFlags/1024/1024);
  fprintf(F,"%s\n",lpDisplayDevice.DeviceKey); //ветка реестра видеоадаптера

 
  // Информация о мониторе

  int DeskHor; //Перем. разреш. по горизонтали для условий смены разреш.
  fprintf(F,"\n");
  fprintf(F,"[Информация о мониторе]\n");
  fprintf(F,"Текущее разрешение экрана по горизонтали: %i\n",DeskHor=GetDeviceCaps(Form1->Canvas->Handle,DESKTOPHORZRES));
  fprintf(F,"Текущее разрешение экрана по вертикали: %i\n",GetDeviceCaps(Form1->Canvas->Handle,DESKTOPVERTRES));
  fprintf(F,"Палитра (бит): %i\n",GetDeviceCaps(Form1->Canvas->Handle,BITSPIXEL));
  fprintf(F,"Частота развертки: %i Герц\n",GetDeviceCaps(Form1->Canvas->Handle,VREFRESH));
  fprintf(F,"Размер экрана монитора по горизонтали: %i мм\n",GetDeviceCaps(Form1->Canvas->Handle,HORZSIZE));
  fprintf(F,"Размер экрана монитора по вертикали: %i мм\n",GetDeviceCaps(Form1->Canvas->Handle,VERTSIZE));

     // расчет диагонали монитора
  int iHorSize,iVertSize,iMonitorDiag;
  iHorSize = GetDeviceCaps(Form1->Canvas->Handle,HORZSIZE);
  iVertSize = GetDeviceCaps(Form1->Canvas->Handle,VERTSIZE);
  iMonitorDiag = ((sqrt(pow(iHorSize,2)+pow(iVertSize,2)))/10)/2.54;
  fprintf(F,"Размер монитора по диагонали: %i Дюймов\n",iMonitorDiag);

 
  // Получение списка устройств

  fprintf(F,"\n");
  fprintf(F,"[Список установленных устройств]\n");

  HDEVINFO hDevInfo;
  SP_DEVINFO_DATA DeviceInfoData;
  DWORD i;

           // все устройства
  hDevInfo = SetupDiGetClassDevs(NULL,
     0, // Enumerator
     0,
     DIGCF_PRESENT | DIGCF_ALLCLASSES);

  if (hDevInfo == INVALID_HANDLE_VALUE) // если список не удалось получить
  {
     fprintf(F,"ERORR! Не удалось получить список\n");
  }
     
           // Перечисление всех устройств в наборе
  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
          &DeviceInfoData);i++)
  {
     DWORD DataT;
     LPTSTR buffer = NULL;
     DWORD buffersize = 0;

     while (!SetupDiGetDeviceRegistryProperty(
              hDevInfo,
              &DeviceInfoData,
              SPDRP_DEVICEDESC,
              &DataT,
              (PBYTE)buffer,
              buffersize,
              &buffersize))
           {
              if (GetLastError() ==
                  ERROR_INSUFFICIENT_BUFFER)
              {
                  // изменение размера буфера
                  if (buffer) LocalFree(buffer);
                  // удвоение размера буфера в случае нехватки для Win2K MBCS systems per KB 888609
                  buffer = (char*)LocalAlloc(LPTR,buffersize * 2);
              }
              else
              {
                  fprintf(F,"ERORR! Не удалось получить список\n");
                  break;
              }
           }

          fprintf(F,"%i %s\n",(i+1),buffer); //  вывод списка в файл

          if (buffer) LocalFree(buffer);
  }
     
     
  if ( GetLastError()!=NO_ERROR &&
           GetLastError()!=ERROR_NO_MORE_ITEMS )
  {
     fprintf(F,"ERORR! Не удалось получить список\n");
  }
        //  очистка памяти от списка
  SetupDiDestroyDeviceInfoList(hDevInfo);


  // Смена разрешения монитора в
  // зависимости от его диагонали:
  // 800x600 меньше 15 дюймов
  // 1024x768 больше 15 или меньше 17 дюймов
  // 1280x1024 больше или равно 17 дюймов

  DEVMODE dm;
  memset(&dm,0,sizeof(DEVMODE));
  dm.dmSize=sizeof(DEVMODE);
  dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;

  if (iMonitorDiag<15 & DeskHor<800)
     {
     dm.dmPelsWidth=800;
     dm.dmPelsHeight=600;
     ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
     ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
                    IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
     }
  if ((iMonitorDiag>=15 | iMonitorDiag<17) & DeskHor<1024)
     {
     dm.dmPelsWidth=1024;
     dm.dmPelsHeight=768;
     ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
     ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
                    IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
     }
   if (iMonitorDiag>=17 & DeskHor<1280)
     {
     dm.dmPelsWidth=1280;
     dm.dmPelsHeight=1024;
     ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
     ShowMessage("Установлено оптимальное разрешение для вашего монитора: "+
                    IntToStr(dm.dmPelsWidth)+"x"+IntToStr(dm.dmPelsHeight));
     }


  fclose(F);// закрытие файла "init.log"
}
merax вне форума Ответить с цитированием
Старый 16.03.2010, 14:10   #4
uehge3434
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию

Спс. Пригодилось Все работает.
uehge3434 вне форума Ответить с цитированием
Старый 16.03.2010, 15:51   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а нельзя просто считать из реестра? там вроде есть вся эта инфа
NiCola999 вне форума Ответить с цитированием
Старый 18.03.2010, 22:01   #6
uehge3434
Новичок
Джуниор
 
Регистрация: 16.03.2010
Сообщений: 2
По умолчанию

Подскажите, пожалуйста, функции (или код), с помощью которых можно узнать размерность шины, частоты и прочую информацию. Очень нужно написать программу наподобие GPU-Z, хотя бы частично.
uehge3434 вне форума Ответить с цитированием
Старый 20.03.2010, 03:01   #7
6pahan6
 
Регистрация: 18.03.2010
Сообщений: 2
По умолчанию

http://letitbit.net/download/7701.eb...part2.rar.html
http://letitbit.net/download/9765.9f...part1.rar.html

вот две ссылки, там выложены видосы, которые помогут в изучении С++, желаю удачи в изучении...
6pahan6 вне форума Ответить с цитированием
Старый 14.04.2012, 16:17   #8
Tymchuk
Пользователь
 
Регистрация: 30.03.2012
Сообщений: 21
По умолчанию

А какие компоненты при этом подключать нужно?
Tymchuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Истинный объём памяти занимаемый записью, record Мессир Общие вопросы Delphi 35 28.01.2008 08:52
Delphi 6 - Программа должна узнать уровень загруженности процессора Никки Общие вопросы Delphi 3 20.11.2007 19:40
Как изменять частоту железа?? UnD)eaD)Snake Общие вопросы Delphi 6 30.07.2007 15:06
как узнать название текущего поля в ComboBox doncova1 Компоненты Delphi 1 19.12.2006 12:52
как определить название жёсткого диска??? PAVEL315 Общие вопросы Delphi 7 20.11.2006 20:27