0

我正在编写两个应用程序,一个生产者和一个消费者。到目前为止,我的代码与 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 的任何想法?

4

1 回答 1

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

这基本上让您可以在一个地方进行转换,然后直接使用结构的成员,而不是在需要访问共享数据的任何地方进行转换。当然,您也可以更详细地使用它——例如,如果您希望能够将(大部分)共享块用于多个目的,您可以使用 aunion而不是 a struct(或者您可能有 astruct包含 aunion等,就像任何其他代码一样)。

于 2012-04-18T14:51:33.593 回答