Завершите эти 3 метода с помощью кода Linux и Mac, независимого от платформы Memory Info. - PullRequest
0 голосов
/ 19 декабря 2011

Взгляните на этот рабочий класс.

Я создал этот класс для своего проекта в Qt, потому что Qt не имеет своих собственных методов для получения информации о памяти, таких как: текущая память процесса, свободная память илиTotal Memory.

Класс адаптирован для Qt, но может быть легко адаптирован для чистого C или других API. Его необходимо связать с "psapi.lib" или -lpsapi

Проблема в том, что мне нужноЧтобы завершить этот класс кодом Linux и Mac, я думаю, что есть много опытных программистов, которые могут заполнить его корректно и работающим кодом ...

заголовочный файл * .h

#ifndef __CLASS__MEMORYINFO__
#define __CLASS__MEMORYINFO__

#include <QtCore>

#ifdef WIN32
    #include <Windows.h>
#endif

class class_MemoryInfo
{
     public:
            class_MemoryInfo( void );

            qlonglong GetFreeMemory( void );
            qlonglong GetTotalMemory( void );
            qlonglong GetCurrentProcesMemory( void );
};

#endif

и * .cpp файл

#include "class_MemoryInfo.h"

#ifdef WIN32
    #include <Psapi.h>
#endif

class_MemoryInfo::class_MemoryInfo()
{
}

qlonglong class_MemoryInfo::GetFreeMemory( void )
{
    qlonglong _value = 0;

    #ifdef WIN32
        MEMORYSTATUSEX MemoryStatus;
        ZeroMemory( &MemoryStatus, sizeof( MEMORYSTATUSEX ) );
        MemoryStatus.dwLength = sizeof( MEMORYSTATUSEX );

        if ( GlobalMemoryStatusEx( &MemoryStatus) )
        {
            _value = MemoryStatus.ullAvailPhys;
        }
        else
            _value = 0;
    #endif

    return _value;
}

qlonglong class_MemoryInfo::GetTotalMemory( void )
{
    qlonglong _value = 0;

    #ifdef WIN32
        MEMORYSTATUSEX MemoryStatus;
        ZeroMemory( &MemoryStatus, sizeof(MEMORYSTATUSEX ));
        MemoryStatus.dwLength = sizeof( MEMORYSTATUSEX );

        if ( GlobalMemoryStatusEx( &MemoryStatus) )
        {
            _value = MemoryStatus.ullTotalPhys;
        }
        else
            _value = 0;
    #endif

    return _value;
}

qlonglong class_MemoryInfo::GetCurrentProcesMemory( void )
{
    qlonglong _value = 0;

    #ifdef WIN32
       PROCESS_MEMORY_COUNTERS pmc;
       if ( GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)) )
           _value = pmc.WorkingSetSize;
       else
           _value = 0;
    #endif

    return _value;
}

1 Ответ

0 голосов
/ 19 декабря 2011

Ну, я не буду полностью писать эквивалент для вставки для вас, но вот базовый план по крайней мере общего объема памяти. Это также должно работать для свободной памяти, но я думаю, что вам, возможно, придется искать память процесса в другом месте.

Mac

Использовать sysctl; man sysctl чтобы увидеть все варианты.

QProcess p;
p.start("sysctl", QStringList() << "hw.physmem");
p.waitForFinished();
QString system_info = p.readAllStandardOutput();
p.close();

Linux

Чтение /proc/meminfo. Откройте этот файл, чтобы увидеть все варианты.

// The actual command is "awk '/MemTotal/ { print $2 }' /proc/meminfo", but
// QProcess has trouble with the single quotes. Putting it as a separate
// argument (without the quotes) seems to work.
p.start("awk", QStringList() << "/MemTotal/ { print $2 }" << "/proc/meminfo");
p.waitForFinished();
QString memory = p.readAllStandardOutput();
p.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...