2012-04-18 9 views
0

私はプロデューサとコンシューマの2つのアプリケーションを作成しています。私のコードは、これまでのMSDNの例とほぼ同じです:Large_Intを使用して共有メモリにアクセスする際の問題

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

私が正しく消費者における応答を引き起こすプロデューサーでイベントを設定しています。プロデューサは共有メモリに値を作成し、コンシューマは正しく応答してから値を開き、MessageBox経由で出力します。

しかし、tchar配列ではなくLARGE_INTを格納するようにプロデューサを取得しようとしています。代わりにCopyMemoryを使用するように変更しようとすると、エラーが発生します。

CopyMemory((PVOID)pBuf, timeStart, sizeof(long)); 

LARGE_INTを格納および取得するために私はそれを修正することができる方法上の任意のアイデア(再び私のコードは、MSDNの例とほぼ同一ですか)?

答えて

1

あなたはtimeStartの値を渡しているが、あなたは、そのアドレスを渡す必要があります。

CopyMemory((PVOID)pBuf, (void *)&timeStart, sizeof(timeStart)); 

編集:私は、私は、これは一般的に行くには間違った方法であると考えていること、しかし、追加する必要があります。 CopyMemoryでは、基本的にすべてを生のビットに変換しています。それで、もう一方の端から出てくる実データに再構成する必要があります。多くは基本的には両側で同じであることを

void *shared_base = whatever; // base address of shared memory segment 

struct shared_data { 
    // The types of the data you actually need to share go here... 
    LARGE_INTEGER x; 
    int y; 
    char z[512]; 
}; 

shared_data *data = (shared_data *)shared_base; 

:その代わりに

、私は一般的のような何かを行うことを好むだろう。その後、生産者側で、あなたのような何かをしたい:

data->x = my_large_integer; 
SetEvent(data_ready); 

を...と消費者側では、何かのように:

LARGE_INTEGER foo = data->x; 
ResetEvent(data_ready); 

これは基本的に1つの場所でキャスト行うことができます、共有データにアクセスする必要があるすべての場所でキャストするのではなく、構造のメンバーを直接使用します。もちろん、あなたはもっと複雑にすることもできます。たとえば、(ほとんどの)共有ブロックを複数の目的で使用できるようにしたい場合は、structの代わりにunionを使用することができます他のコードと同様にunionなどを含むstructがあるかもしれません。

+0

素晴らしい、ありがとう! – RobVoisey

+0

簡単な質問 - LPCTSTR(pBuf)をLARGE_INTEGER(時間)に変換するにはどうすればよいですか? – RobVoisey

+0

@Tsar:あなたが得ているのは 'LARGE_INTEGER'のアドレスだけなので、元のタイプに戻すことができます。 –

関連する問題