I need to know how many free memory are on System on real time.
I’m on Windows Standalone Application.
I use
cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
public float getAvailableRAM(){
return ramCounter.NextValue();
}
but always return 0!!
Any solution?
You can PInvoke into this API:
Please can you explain a little how to do this?
thanks you
Something like this:
struct MEMORYSTATUSEX
{
public int dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX memoryStatus);
static ulong GetAvailableMemory()
{
var structureSize = Marshal.SizeOf(typeof(MEMORYSTATUSEX));
var memoryStatus = default(MEMORYSTATUSEX);
memoryStatus.dwLength = structureSize;
if (!GlobalMemoryStatusEx(ref memoryStatus))
throw new Win32Exception(Marshal.GetLastWin32Error());
return memoryStatus.ullAvailPageFile;
}
1 Like
Perfect!! It Works!!
I found also this code and Works ok
public class PerformanceDataInfo : MonoBehaviour {
public class PerfomanceInfoData
{
public Int64 CommitTotalPages;
public Int64 CommitLimitPages;
public Int64 CommitPeakPages;
public Int64 PhysicalTotalBytes;
public Int64 PhysicalAvailableBytes;
public Int64 SystemCacheBytes;
public Int64 KernelTotalBytes;
public Int64 KernelPagedBytes;
public Int64 KernelNonPagedBytes;
public Int64 PageSizeBytes;
public int HandlesCount;
public int ProcessCount;
public int ThreadCount;
}
[StructLayout(LayoutKind.Sequential)]
public struct PsApiPerformanceInformation
{
public int Size;
public IntPtr CommitTotal;
public IntPtr CommitLimit;
public IntPtr CommitPeak;
public IntPtr PhysicalTotal;
public IntPtr PhysicalAvailable;
public IntPtr SystemCache;
public IntPtr KernelTotal;
public IntPtr KernelPaged;
public IntPtr KernelNonPaged;
public IntPtr PageSize;
public int HandlesCount;
public int ProcessCount;
public int ThreadCount;
}
[DllImport("psapi.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetPerformanceInfo([Out] out PsApiPerformanceInformation PerformanceInformation, [In] int Size);
// Use this for initialization
void Start () {
}
static double ConvertBytesToMegabytes(long bytes)
{
return (bytes / 1024f) / 1024f;
}
public static PerfomanceInfoData GetPerformanceInfo()
{
PerfomanceInfoData data = new PerfomanceInfoData();
PsApiPerformanceInformation perfInfo = new PsApiPerformanceInformation();
if (GetPerformanceInfo(out perfInfo, Marshal.SizeOf(perfInfo)))
{
/// data in pages
data.CommitTotalPages = perfInfo.CommitTotal.ToInt64();
data.CommitLimitPages = perfInfo.CommitLimit.ToInt64();
data.CommitPeakPages = perfInfo.CommitPeak.ToInt64();
/// data in bytes
Int64 pageSize = perfInfo.PageSize.ToInt64();
data.PhysicalTotalBytes = perfInfo.PhysicalTotal.ToInt64() * pageSize;
data.PhysicalAvailableBytes = perfInfo.PhysicalAvailable.ToInt64() * pageSize;
data.SystemCacheBytes = perfInfo.SystemCache.ToInt64() * pageSize;
data.KernelTotalBytes = perfInfo.KernelTotal.ToInt64() * pageSize;
data.KernelPagedBytes = perfInfo.KernelPaged.ToInt64() * pageSize;
data.KernelNonPagedBytes = perfInfo.KernelNonPaged.ToInt64() * pageSize;
data.PageSizeBytes = pageSize;
/// counters
data.HandlesCount = perfInfo.HandlesCount;
data.ProcessCount = perfInfo.ProcessCount;
data.ThreadCount = perfInfo.ThreadCount;
}
return data;
}