我正在编写两个应用程序,一个生产者和一个消费者。到目前为止,我的代码几乎与MSDN示例相同:
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的任何想法?
您传递的值为 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
(或者您可能有一个包含union
等的struct
,就像任何其他代码一样)。