Вы правы, что вам неудобно с этим кодом. Кажется, что каждый из вызванных методов знает, какая следующая строка должна быть обработана, поэтому они тесно связаны, и логика для принятия решения о следующей строке распределена по нескольким методам. Yeuch! Если следующий ряд действительно должен быть на 1 больше предыдущего, то, вероятно, лучше централизовать эту логику в методе createControlPanel
:
private void createControlPanel() {
int initialRow = 0;
initSessionControls(controlPanelGB, initialRow);
initBidControls(controlPanelGB, initialRow+1);
initSnapshotControls(controlPanelGB, initialRow+2);
}
Это яснее, чем ваше второе решение выше, так как ясно что второй аргумент является строкой, и как он связан с начальным значением строки.
В Windows вы можете использовать GlobalMemoryStatusEx для получения фактического объема ОЗУ.
Информацию о процессоре можно получить через GetSystemInfo .
В Windows для определения тактовой частоты процессора:
double CPUSpeed()
{
wchar_t Buffer[_MAX_PATH];
DWORD BufSize = _MAX_PATH;
DWORD dwMHz = _MAX_PATH;
HKEY hKey;
// open the key where the proc speed is hidden:
long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
0,
KEY_READ,
&hKey);
if(lError != ERROR_SUCCESS)
{// if the key is not found, tell the user why:
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
lError,
0,
Buffer,
_MAX_PATH,
0);
wprintf(Buffer);
return 0;
}
// query the key:
RegQueryValueEx(hKey, L"~MHz", NULL, NULL, (LPBYTE) &dwMHz, &BufSize);
return (double)dwMHz;
}
Вот один из способов получить нужную информацию на машине Windows. Я скопировал и вставил его из реального проекта с некоторыми незначительными изменениями, поэтому не стесняйтесь очистить его, чтобы было больше смысла.
int CPUInfo[4] = {-1};
unsigned nExIds, i = 0;
char CPUBrandString[0x40];
// Get the information associated with each extended ID.
__cpuid(CPUInfo, 0x80000000);
nExIds = CPUInfo[0];
for (i=0x80000000; i<=nExIds; ++i)
{
__cpuid(CPUInfo, i);
// Interpret CPU brand string
if (i == 0x80000002)
memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
else if (i == 0x80000003)
memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
else if (i == 0x80000004)
memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
}
//string includes manufacturer, model and clockspeed
cout << "CPU Type: " << CPUBrandString << endl;
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
cout << "Number of Cores: " << sysInfo.dwNumberOfProcessors << endl;
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex);
GlobalMemoryStatusEx(&statex);
cout << "Total System Memory: " << (statex.ullTotalPhys/1024)/1024 << "MB" << endl;
Для получения дополнительной информации см. GetSystemInfo , GlobalMemoryStatusEx и __ CPUID . Хотя я не включил его, вы также можете определить, является ли ОС 32 или 64-разрядной, с помощью функции GetSystemInfo.
Процессор прост. Используйте инструкцию cpuid
. Я оставлю другие плакаты, чтобы найти портативный способ определить, сколько оперативной памяти есть в системе. : -)
Для методов, специфичных для Linux, вы можете получить доступ к / proc / meminfo
(и / proc / cpuinfo
, если вам не удается проанализировать cpuid
ответов).
В Linux вы можете анализировать / proc / cpuinfo (содержит блок информации о каждом процессоре) и / proc / meminfo (содержит различные общие статистические данные о памяти, включая MemTotal).
http://en.wikipedia.org/wiki/CPUID Может помочь для CPUID
В Solaris:
-Для памяти
prtconf | grep Memory
-Для ЦП
psrinfo -v | grep MHz