我正在写两个应用程序,一个生产者和一个消费者。到目前为止,我的代码几乎与MSDN示例相同:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx
我在Producer中设置了一个事件,它正确触发了消费者的响应。生产者在共享内存中创建一个值,消费者正确响应,然后打开该值并通过MessageBox打印它。
但是我试图让生产者存储LARGE_INT而不是tchar数组。当我尝试将CopyMemory更改为使用long时,我会收到错误。
CopyMemory((PVOID)pBuf, timeStart, sizeof(long));
关于我如何修改它的任何想法(我的代码与MSDN示例几乎相同)来存储和检索LARGE_INT?
答案 0 :(得分: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
等,就像其他代码一样。)