2011-07-23 11 views
2

GlobalMemoryStatusExの説明は、()言う:GlobalMemoryStatusEx関数によって返さGlobalMemoryStatusEx()(Win32の)

情報が揮発性です。この関数への2つの連続した呼び出しが同じ情報を返すという保証はありません。

この関数から返される情報の1つは、「合計物理メモリ(バイト単位)」です。 (これは、使用可能な物理メモリの量とは異なります。

プログラムを実行するたびに、物理メモリの総量はどのように変更できますか?値をテキストファイルに出力し、結果を得ました:

55872198592 
55837267904 
8589934605 
55835301824 
55848146880 
55849064384 
55849129920 
55836743616 
8589934605 
8589934605 
8589934605 
8589934605 
55835105216 

私は4GBのシステムRAMを持っています。私が64ビットOSを使用している場合、別のAPI関数を呼び出す必要がありますか?ここで

はコードです:

#include <Windows.h> 
#include <string> 
#include <sstream> 
#include "Game.h" 
#include <fstream> 

void Game::CheckMemory(DWORDLONG& a) 
{ 
MEMORYSTATUSEX status; 
GlobalMemoryStatusEx(&status); 

a = status.ullTotalPhys; 

std::stringstream ss; 

ss << "Total Physical Memory: " << status.ullTotalPhys << "bytes." << std::endl; 

MessageBoxA(NULL, ss.str().c_str(), "Mem Summary", 0); 
} 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       PSTR szCmdLine, int iCmdShow) 
{ 
DWORDLONG a; 
Game g; 
g.CheckMemory(a); 

std::fstream fs("test.txt", std::fstream::in | std::fstream::out | std::fstream::app); 

fs << a << std::endl; 

fs.close(); 

return 0; 
} 
+1

使用しているコードの短いスニペットを投稿してください。これは奇妙に聞こえます。 – Mat

+0

コードを組み込むように編集しました。私は値を.txtファイルに出力し、メッセージボックスを介して出力しています。 – zooker

+0

ハードウェアの故障とホットスワップは、もっともらしい理由として考えています。 –

答えて

10

MEMORYSTATUSEXのメンバをdwLengthで初期化してから、関数を呼び出す必要があります。

MEMORYSTATUSEX status; 
status.dwLength = sizeof(status); 
GlobalMemoryStatusEx(&status); 

です。構造体で何かを行う前に、戻り値を確認する必要があります。

+0

私が読んでいた本のようなものは少し日付がついていて、これを含めていないようです。私は今、期待される結果を得ています。ありがとう! – zooker

0

あなたは必ず出力正しいフィールドはありますか?あなたがリストした最初の数字は約55GBです。これは4GBのRAMしか持っていなかった場合にはあまり意味がありません。

0

msdnのヘルプに記載されています。 GlobalMemoryStatusEx関数を使用して、他のアプリケーションに深刻な影響を与えることなくアプリケーションが割り当てることができるメモリの量を判断できます。

GlobalMemoryStatusEx関数によって返される情報はvolatileです。この関数への2つの連続した呼び出しが同じ情報を返すという保証はありません。

lpBufferのMEMORYSTATUSEX構造体のullAvailPhysメンバには、すべてのNUMAノード用のメモリが含まれています。

したがって、戻り値は異なる呼び出しで異なる可能性があり、正しい答えです。