项目研发过程中用到了进程通信,由C++应用程序创建共享内存及两个同步事件(Event1、Event2),然后阻塞等待外部进程激活事件Event1,Event1激活后,C++应用程序读取共享内存中的数据,完成数据解析后执行相应指令,并向共享内存中写入指令执行结果,同时激活事件Event2;而Python进程则负责打开共享内存和两个同步事件,向共享内存中写入数据,并激活Event1,然后阻塞等待Event2被激活,Event2激活后,读取共享内存中的数据。进程通讯关系如下图所示:

C++程序源码如下:

DWORD WINAPI IPC_ReadExecuteCmd(LPVOID lpParameter)
{unsigned long buff_size = IPC_BufferSize;ControlCmdPara ReceiveData;memset(&ReceiveData, 0, sizeof(ReceiveData));ControlCmdPara SendData;memset(&SendData, 0, sizeof(SendData));HANDLE file_shared_handler = CreateFile(L"shared_memory",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (file_shared_handler == INVALID_HANDLE_VALUE)cout << "create file error" << endl;HANDLE file_mapping_handler = CreateFileMapping(file_shared_handler, NULL, PAGE_READWRITE, 0, buff_size, L"shared_memory");if (file_mapping_handler == INVALID_HANDLE_VALUE)cout << "create file_mapping error" << endl;LPVOID lp_base = MapViewOfFile(file_mapping_handler, FILE_MAP_ALL_ACCESS, 0, 0, 0);if (lp_base == INVALID_HANDLE_VALUE)cout << "MapViewOfFile error" << endl;HANDLE m_hEvent = CreateEvent(NULL, FALSE, FALSE, GLOBAL_EVENT_NAME);if (m_hEvent == nullptr)cout << "create Event error";HANDLE WaitEvent = CreateEvent(NULL, FALSE, FALSE, GLOBAL_EVENT_WAIT);if (WaitEvent == nullptr)cout << "create WaitEvent error";CString IPC_Cmd, strScriptKeyWord, strParameter;LRESULT lScriptCmdResult = 0;while (true){WaitForSingleObject(m_hEvent, INFINITE);memcpy(&ReceiveData, lp_base, buff_size);/* 调用API执行指令*/IPC_Cmd = string(ReceiveData.Cmd).substr(0, 15).c_str();strScriptKeyWord = string(ReceiveData.YjksCmd).substr(0, 31).c_str();strParameter = string(ReceiveData.Para).substr(0, 975).c_str();strScriptKeyWord.TrimRight();strParameter.TrimRight();IPC_Cmd.TrimRight();string ResaultStr = "Success";strcpy(SendData.Cmd, "Result");if (!IPC_Cmd.CompareNoCase(PLAYBACK)){lScriptCmdResult = IPC_ExecuteScrCmd(strScriptKeyWord, strParameter);}if (!IPC_Cmd.Compare(RECORD)){lScriptCmdResult = IPC_ExecuteScrCmd(L"_makescript", L"");}if (lScriptCmdResult < 0) ResaultStr = "Failure";strcpy(SendData.Para, ResaultStr.c_str());memcpy(lp_base, &SendData, buff_size);if (WaitEvent != nullptr) SetEvent(WaitEvent);}FlushViewOfFile(lp_base, buff_size);UnmapViewOfFile(lp_base);CloseHandle(file_mapping_handler);CloseHandle(file_shared_handler);return 0;
}

Python程序源码如下:

from ctypes import *
import mmapdef IPC_CmdControl(IPC_Cmd,strScriptKeyWord,strParameter):print(windll.kernel32.GetLastError())buff_size = 1024EVENT_ALL_ACCESS = 0x000F0000|0x00100000|0x3shm = mmap.mmap(0, buff_size, "shared_memory")OpenEvent=windll.kernel32.OpenEventWm_hEvent = OpenEvent(2, True, "Global\\ShareMemoryEvent")WaitEvent = OpenEvent(EVENT_ALL_ACCESS, True, "Global\\WaitResaultEvent")strParameter = "\""+strParameter+"\"";if shm:shm[:] = b' ' * buff_sizeshm.seek(0)shm.write(bytes(IPC_Cmd, 'UTF-8'))shm.seek(16)shm.write(bytes(strScriptKeyWord, 'UTF-8'))shm.seek(48)shm.write(bytes(strParameter, 'UTF-8'))windll.kernel32.SetEvent(m_hEvent)windll.kernel32.WaitForSingleObject(WaitEvent,-1)shm.seek(48)return shm.read(7).rstrip()if __name__ == '__main__':IPC_CmdControl(IPC_Cmd,strScriptKeyWord,strParameter)

C++进程和Python进程通信相关推荐

  1. python异步和进程_12.python进程\协程\异步IO

    进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , P ...

  2. 什么是进程?Python进程各部分内容介绍

    程序是一个没有生命的实体,它包含许多由程序设计语言编写的.但未被执行的指令,这些指令经过编译和执行才能完成指定动作. 程序被执行后成为了一个活动的实体,这个实体就是进程.换言之,操作系统调度并执行程序 ...

  3. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

    1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...

  4. python并行计算进程池通信_Python使用进程池管理进程和进程间通信

    与线程池类似的是,如果程序需要启动多个进程,也可以使用进程池来管理进程.程序可以通过 multiprocessing 模块的 Pool() 函数创建进程池,进程池实际上是 multiprocessin ...

  5. python进程socket通信_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  6. Python 进程间的通信

    这里先简述一下进程之间为什么要进行通信 我们要知道进程是资源分配的基本单位,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程资源 进程间通信的目的 数据传输:一个进程需要将他的 ...

  7. python进程socket通信_python3 进程间通信之socket.socketpair()

    python3 进程间通信之socket.socketpair() socket.socketpair()是什么鬼东西? socket.socketpair()函数仅返回两个已经连接的套接字对象,参数 ...

  8. Python进程池Pool、进程池通信

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  9. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  10. python进程、线程的学习心得

    什么是多线程竞争? 线程不是独立的,同一个进程里的线程,线程间的数据是共享的,多线程操作时,容易造成数据的混乱,线程不安全. 如何解决? 互斥锁. 好处:能够保证某段关键代码执行时,只有一个线程操作, ...

最新文章

  1. 在Linux系统中修改目录的权限如何恢复
  2. 数据结构-冒泡排序最优代码(C语言)
  3. 计算机导论中IEE是什么缩写,Proc.IEE是期刊吗?全称是什么
  4. 分析android动画模块[转]
  5. 云服务器饥荒_运用双腾讯云搭建《饥荒》多人联机服务器
  6. AndroidStudio安卓原生开发_UI高级_RecyclerView_循环复用控件_代替ListView_GridView---Android原生开发工作笔记121
  7. crawler4j源码学习(1):搜狐新闻网新闻标题采集爬虫
  8. 基于改进自动色彩均衡算法的图像增强方法(含程序)
  9. Elaine的python初学习
  10. 2015 年电赛测评试题——多种波形发生器
  11. 变量选择详解与源码实现
  12. 问题:SQL Server数据库不允许更改
  13. windox连接电子秤通过COM口获取数据(java)
  14. java.beans 包_JavaBeans的介绍与使用
  15. C语言:比较三个数(double类型)的大小
  16. 8086寄存器学习笔记-SS 寄存器和 SP 寄存器
  17. 《疯狂动物城》观影感受
  18. 基于ssm的校园二手物品交易平台(idea+spring+springmvc+mybatis+jsp)
  19. 【Basic】SVM(支持向量机)分类算法
  20. 已知一个二维数组A 表示一个矩阵,求AT。 其中,AT 表示矩阵的转置。矩阵转置的含义:表示把一个矩阵行列互换。

热门文章

  1. mariadb 卸载 Kali_Revo Uninstaller(卸载工具) 专业版!!!
  2. SimNow仿真交易【官方环境介绍】 期货仿真环境地址 期货模拟交易
  3. SpringBoot java串口操作(rxtx)
  4. 电动汽车用内置式永磁同步电机基于查询表 的矢量控制算法, 自动生成满足 MTPA
  5. VS自带数据库SqlExpress
  6. Python SVM手写数字识别
  7. 【Unity】【Code】通用代码库(一)——物体的wasd移动
  8. 显卡识别为Microsoft基本显示适配器,安装9700k核芯显卡HD630驱动或安装其他核显驱动
  9. 软件测试书单/书籍推荐(整理更新中)
  10. win10通过VMware使用教程