1

ゲーム (PT では「jogo」) を開発すると、サーバーは最大 5 つの同時ゲームをホストでき、クライアントはマップされたメモリを介してアクセスします。

だからここに私が持っているものがあります:

サーバ:

#define MAX_JOGOS 5
typedef struct{
...
} sJogo;

typedef struct{
sJogo * pS;
} sGlobals;

sJogo jogo[MAX_JOGOS]; //global
sGlobals globals[MAX_JOGOS]; //global
HANDLE hMapFile; //global

int _tmain(int argc, LPTSTR argv[]) {
   ...
   hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(sJogo)*MAX_JOGOS, szName);
   //create map for all games
   ....
}

//called when new game is created
void createView(int index){
   //create view for 1 game and store pointer
   //### need to apply offset here ###
   globals.pS[index] = (sJogo * )MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(sJogo);      
}

//called by thread on event set
void CopyJogo(int index){
  //use stored pointer to update jogo
  CopyMemory((PVOID)globals[index].pS, &jogo[index], sizeof(sJogo));
}

クライアント:

HANDLE hMapFile; //global
sJogo * pS; //global

int _tmain(int argc, LPTSTR argv[]) {
    ...
    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
    pS =  (sJogo *)MapViewOfFile(cdata.hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(sJogo));
    //### need respective offset here ###
}

「sizeof(sJogo)*MAX_JOGOS」のビューを作成してから、ポインター +=sizeof(sJogo) * index; をインクリメントしてみました。うまくいかなかったので、オフセットの使い方を教えてもらえますか?

私はかなりしつこく検索し、ここでstackoverflowで良い例を見つけましたが、それはC ++であり、適応できませんでした.

上位の DWORD オフセットは sizeof(sJogo) で正しいでしょうか? しかし、粒度とは何か、またはそれを下位のDWORDに適用する方法がわかりません...

手伝って頂けますか?ありがとうございました。


編集:

以下のコードは、i = 1 (NULL) のときに返されますが、何が間違っていますか?

int _tmain(int argc, LPTSTR argv[]) {
....
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(sJogo)*MAX_JOGOS, szName);
if (hMapFile == NULL)
{...}

DWORD offset = 0;
for (i = 0; i < MAX_JOGOS; i++) {
    if (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, offset, sizeof(sJogo)) == NULL)
    {
        _tprintf(TEXT("Erro MapViewOfFile I: %d\n"), i);
        CloseHandle(hMapFile);
        return;
    }
    offset += sizeof(sJogo);
}
}

編集2:

上記の問題を解決し、ここで解決策を見つけました:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366548%28v=vs.85%29.aspx

2 回目の試行で MapViewOfFile が NULL を返す原因となっていた、オフセットの割り当ての粒度を考慮していませんでした。

上記のリンクは、それをオフセットに適用する方法の明確な例を示しています。

4

1 に答える 1