首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步共享内存

同步共享内存
EN

Stack Overflow用户
提问于 2012-10-15 09:40:01
回答 1查看 506关注 0票数 0

我已经成功地在Windows上的两个进程之间进行了共享内存通信。我是这样写的:

请不要介意我对自己的评论。我想我会从这张图中得到一些乐趣。我怎样才能更快地做到这一点?换句话说,我如何使用互斥锁或CreateEvent来做到这一点呢?我努力去理解Mutexes和CreateEvent,但是它把我搞糊涂了,因为它用在应用程序和线程上。一个示例会很有帮助,但不是必需的。

我现在做的方式是(非常慢!):

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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.
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 10:21:05

您可以在进程之间使用事件和互斥。这可以很好地工作。您只需要复制对象的句柄,然后再将其传递给其他进程:

代码语言:javascript
复制
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个事件。第一方将发出数据准备就绪的信号。在那之后,第一方也在做同样的事情。

事件函数有:CreateEventSetEvent,... CloseHandle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12888261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档