Как получить текущий ЦП и Использование оперативной памяти в C++?

Вы хотите заменить только значение «103» в исходном рабочем коде, так что это единственная часть, которую вы должны изменить.

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("target_combo_box_property", action='store_true')
    parser.add_argument("target_combo_box_value", type=int)
    parser.add_argument("target_searched_string")

    args = parser.parse_args()    
    app = Application(backend='win32').connect(path="app.exe")
    findWindow = app.Find
    fieldDrpDwn = findWindow.child_window(control_id=args.target_combo_box_value)    
    select_combo_box_item(fieldDrpDwn, args.target_searched_string) 

if __name__ == '__main__':
    main()
29
задан BradleyDotNET 16 September 2014 в 22:18
поделиться

7 ответов

Существует библиотека с открытым исходным кодом, которая дает их (и больше материала информации о системе) через многие платформы: SIGAR API

я использовал его в довольно крупных проектах, и это хорошо работает (за исключением определенных угловых случаев на OS X и т.д.)

11
ответ дан ididak 28 November 2019 в 01:22
поделиться

К сожалению, эти вещи в значительной степени зависят от базовой ОС, поэтому нет вызовов, не зависящих от платформы. (Может быть, есть некоторые оболочки-оболочки, но я не знаю ни одной.)

В Linux вы можете взглянуть на вызов функции getrusage () , в Windows вы можете использовать GetProcessMemoryInfo () для использования оперативной памяти. Посмотрите также на другие функции в API статуса процесса Windows.

30
ответ дан Kosi2801 28 November 2019 в 01:22
поделиться

Нет независимой от платформы функции для этого, что я знаю о. ЕСЛИ Вы планируете быть нацеленными на несколько версий Windows, знают, что реализация отличается через некоторые версии. Я поразил эту проблему при тестировании приложения под NT 3.51, например... (архаичный, я знаю).

Вот некоторый код, который я использовал для стороны памяти вещей. Это не работает через платформы кроме окон и просто возвратится 0 при компиляции без WIN32 определите:

РЕДАКТИРОВАНИЕ: Я забыл упоминать, этот код делится и округляет в меньшую сторону до ближайшего МБ, следовательно>> 20 повсеместно.

// get memory info...
int getTotalRAM()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullTotalPhys>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwTotalPhys>>20);
    }
#endif
    return ret;
}

int getAvailRAM()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullAvailPhys>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwAvailPhys>>20);
    }
#endif
    return ret;
}

int getTotalMemory()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
    }
#endif
    return ret;
}

int getAvailMemory()
{
    int ret = 0;
#ifdef WIN32
    DWORD v = GetVersion();
    DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
    DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
    DWORD build;
    if (v < 0x80000000) build = (DWORD)(HIWORD(v));
    else build = 0;

    // because compiler static links the function...
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");

    if(GMSEx)
    {
        MEMORYSTATUSEX m;
        m.dwLength = sizeof(m);
        if(GMSEx(&m))
        {
            ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
        }
    }
    else
    {
        MEMORYSTATUS m;
        m.dwLength = sizeof(m);
        GlobalMemoryStatus(&m);
        ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
    }
#endif
    return ret;
}
11
ответ дан jheriko 28 November 2019 в 01:22
поделиться

Нет, нет, не в стандарте.

Если вам действительно нужна эта информация, вам придется написать специфичные для платформы #ifdefs или ссылку на библиотеку, которая ее предоставляет.

5
ответ дан HUAGHAGUAH 28 November 2019 в 01:22
поделиться

Не существует независимого от платформы способа сделать это. Хотя для Windows вы можете получить показатели использования ЦП и производительности, используя PDH.dll (Performance Data Helper) и связанные с ним API в своем коде.

Подробнее о том, как его использовать.

1
ответ дан Samrat Patil 28 November 2019 в 01:22
поделиться

Не непосредственно.

, Но можно пользоваться библиотекой, которая абстрагирует ОС (такую как ACE).
, Хотя этот мог бы немного тяжелым, если Вы просто хотите ЦП и Память.

0
ответ дан Martin York 28 November 2019 в 01:22
поделиться

Если это все еще так, проверьте:

http://sourceforge.net/projects/cpp-cpu-monitor/

Это дает вам пример того, как получить использование процессора и оперативной памяти Linux (протестировано на Debian и CentOS) и довольно простая инструкция по установке.

Пожалуйста, не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы относительно этого небольшого проекта.

0
ответ дан Bartosz Pachołek 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: