0

我在 Windows 上的两个进程之间成功共享内存通信。我这样写: 在此处输入图像描述

不要介意我对自己的评论。我想我会对图表有一些乐趣。我怎样才能更快地做到这一点?换句话说,我如何使用 Mutex 或 CreateEvent 来做到这一点?我努力理解 Mutexes 和 CreateEvent,但它在 MSDN 上让我感到困惑,因为它在应用程序和线程上使用。一个例子会很有帮助,但不是必需的。

我目前的做法是(非常慢!):

//使用 Filename + KnownProcessID 创建 SharedMemory,这样我就可以拥有多个具有唯一映射的客户端和服务器。我已经有这个工作和沟通成功。

bool SharedMemoryBusy()
{
    double* Data = static_cast<double*>(pData);   //Pointer to the mapped memory.
    return static_cast<int>(Data[1]) > 0 ? true : false;
}

void* RequestSharedMemory()
{
    for (int Success = 0; Success < 50; ++Success)
    {
        if (SharedMemoryBusy())
            Sleep(10);
        else
            break;
    }
    return pData;
}

bool SharedMemoryReturned()
{
    double* Data = static_cast<double*>(pData);
    return static_cast<int>(Data[1]) == 2 ? true : false;
}

bool SharedDataFetched()
{
    for (int Success = 0; Success < 50; ++Success)
    {
        if (SharedMemoryReturned())
            return true;

        if (!SharedMemoryBusy())
            return false;

        Sleep(10);
    }
    return false;
}

读写部分(只是一个应要求的例子..可以有许多不同的类型..模型、点、位置等):

void* GLHGetModels()
{
    double* Data = static_cast<double*>(RequestSharedMemory());
    Data[0] = MODELS;
    Data[1] = StatusSent;

    if (SharedDataFetched())
    {
        if (static_cast<int>(Data[2]) != 0)
        {
            unsigned char* SerializedData  = reinterpret_cast<unsigned char*>(&Data[3]);
            MemDeSerialize(ListOfModels, SerializedData, static_cast<int>(Data[2]));
            return Models.data();
        }
        return NULL;
    }
    return NULL;
}

void WriteModels()
{
    If (pData[0] == MODELS)
    {
        //Write The Request..
        Data[1] = StatusReturned;
        Data[2] = ListOfModels.size();
        unsigned char* Destination = reinterpret_cast<unsigned char*>(&Data[3]);
        MemSerialize(Destination, ListOfModels); //Uses MEMCOPY To copy to Destination.
    }
}
4

1 回答 1

1

您可以在进程之间使用事件和互斥锁。这工作正常。您只需要在将对象传递给其他进程之前复制对象的句柄:

BOOL WINAPI DuplicateHandle(
  _In_   HANDLE hSourceProcessHandle,
  _In_   HANDLE hSourceHandle,
  _In_   HANDLE hTargetProcessHandle,
  _Out_  LPHANDLE lpTargetHandle,
  _In_   DWORD dwDesiredAccess,
  _In_   BOOL bInheritHandle,
  _In_   DWORD dwOptions
);

每个进程都使用自己的句柄,而它们都引用同一个内核对象。

您需要做的是创建 2 个事件。第一方将发出数据准备就绪的信号。对方应该获取数据,放置自己的数据,重置第一个事件并通知第二个事件。之后,第一方也在做同样的事情。

事件函数是:CreateEvent, SetEvent, ... CloseHandle

于 2012-10-15T02:21:04.833 回答