2012-04-18 101 views
0

我正在編寫兩個應用程序,一個生產者和一個消費者。我的代碼是幾乎相同的迄今爲止的MSDN例如:使用Large_Int訪問共享內存的問題

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

我已經設置了在其中正確地觸發在消費者的響應生產者的事件。生產者在共享內存中創建一個值,並且消費者正確響應,然後打開該值並通過MessageBox進行打印。

但是我試圖讓生產者存儲一個LARGE_INT而不是一個tchar數組。當我嘗試更改CopyMemory來使用長而不是,我得到錯誤。

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

如何,我可以修改它的任何意見(再次我的代碼是幾乎相同的MSDN例子)來存儲和檢索LARGE_INT?

回答

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); 

這基本上讓你做鑄造在一個地方,然後直接使用該結構的成員,而不是在需要訪問共享數據的任何地方進行強制轉換。當然,您也可以更加詳細地闡述它 - 例如,如果您希望能夠將(大部分)共享塊用於多個目的,則可以使用union而不是struct(或你可能有一個struct包含union等,就像其他任何代碼一樣)。

+0

真棒,謝謝! – RobVoisey 2012-04-18 14:56:50

+0

快速問題 - 我如何將LPCTSTR(pBuf)轉換爲LARGE_INTEGER(時間)? – RobVoisey 2012-04-18 15:03:05

+0

@Tsar:因爲你得到的只是'LARGE_INTEGER'的地址,所以你可以將它轉換回原來的類型。 – 2012-04-18 15:29:01