文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- `参考网址: `[Gitee上的中文介绍(比看官网英文好多了)](https://gitee.com/solym/ZeroMQ-Guide-Zh/blob/master/chapter1.md#zmq-%E6%8C%87%E5%8D%97) [官网介绍(关注对应C++的cppzmq就行)](https://zeromq.org/languages/cplusplus/#cppzmq) [直接下编译好的库libzmq-v142-x64(只有4_3_4版本编好的库,其它版本要自己编)](https://github.com/zeromq/libzmq/releases) [查接口用法(官网的)](http://api.zeromq.org/) C++和python通信(Windows+ZeroMQ)
- 一、ZeroMQ是什么?
- 二、使用步骤
- 1.配置
- 2.py测试
- 3.C++测试
- 总结
前言
参考网址:
Gitee上的中文介绍(比看官网英文好多了)官网介绍(关注对应C++的class="superseo">cppzmq就行)
直接下编译好的库libzmq-v142-x64(只有4_3_4版本编好的库,其它版本要自己编)
查接口用法(官网的)
C++和python通信(Windows+ZeroMQ) 一、ZeroMQ是什么?
zmq是对socket进行封装的库,header-only的(和配置opencv环境差不多)用法像ROS的node,分server端和client端,通过请求和应答通信(像是阻塞函数,server会一直等待request)
二、使用步骤 1.配置1.用于python的pyzmq库:cmd:
pip install pyzmq
可能会报错要先安装PyHamcrest,同样pip安装就好;
2.下载这些库:随便找个文件夹放
3.配置环境:
4.单独把两个.dll库copy放入工程下的x64 > Release下(前提覆盖率软件是Release的)
Test.py代码如下(示例):
# -*- coding: UTF-8 -*-
#测试py的client端
import zmq
def test():
context = zmq.Context() #创建上下文context,固定写法
socket = context.socket(zmq.REQ) #创建socket,固定写法,客户端是REQ
socket.connect("tcp://localhost:7777") #连接,按需要修改7777,要和C++的对应,随便编个
socket.send(b"Test") #给服务端发送信息,b不能改,引号里面可以改,但没啥用
response = socket.recv() #接受服务端返回的信息
print(response)
if __name__ == '__main__':
test()
控制覆盖率软件的start、save、用上面的复制,然后改7777就行
3.C++测试
SaveControl.c++代码如下(示例):
#include "../include/SaveControl.h"
#include
#include
SaveControl::SaveControl(sbm::UI* uier_)
{
this->uier_ = uier_;
return;
}
void SaveControl::Save_Server()
{
// Prepare our context and socket
zmq::context_t context(1); //创建上下文,固定写法
zmq::socket_t socket(context, ZMQ_REP); //创建socket,固定写法
socket.bind("tcp://*:7777"); //#socket绑定,*表示本机ip,端口号为7777,采用tcp协议通信
do {
zmq::message_t request; //创建请求
//运行后会阻塞到当前语句, 直到收到来自客户端的信息,就是py的"Test", 然后存入至message
socket.recv(&request);
std::cout << "Received Request Save:" << std::endl;
// Do some 'work'
uier_->SetPySave(); //设置点击save,保存覆盖率报告
//zmq_sleep(1);
zmq::message_t reply(5); //回应
memcpy((void *)reply.data(), "Get!", 5); //回应"Get!",新开启的cmd会显示它
socket.send(reply);
} while (true); //设置一直循环,就可以一直阻塞,可以多次重复运行py
}
头文件SaveControl.h
#pragma once
#include
#include "../include/ui.h"
class SaveControl {
public:
SaveControl(sbm::UI* uier_);
void Save_Server();
private:
sbm::UI* uier_;
};
控制软件的start、save、用上面的复制,然后改7777就行
其它部分:要新建线程来运行上面的阻塞函数
Control_Thread.cpp
#include "../include/Control_Thread.h"
#include "../include/SaveControl.h"
Control_Thread::Control_Thread(sbm::UI* uier_)
{
/*startControl_ = new Control(uier_);
t1 = new std::thread(&Control::Start_Server, startControl_); //start可以同样 *** 作*/
saveControl_ = new SaveControl(uier_);
t2 = new std::thread(&SaveControl::Save_Server, saveControl_); //save
}
头文件Control_Thread.h
#pragma once
#include
#include "../include/SaveControl.h"
//#include "../include/StartControl.h"
//class StartControl;
class SaveControl;
class Control_Thread {
public:
Control_Thread(sbm::UI* uier_);
private:
//StartControl* startControl_;
SaveControl* saveControl_;
//std::thread* t1;
std::thread* t2;
};
ui.cpp我修改的部分:
if (ImGui::Button("Save", ImVec2(50, 25)) || setPySave) { //这样既可以py控制,GUI也可以控制
void UI::SetPySave() { setPySave = true; } //py将变量置为true
//UI的构造函数下置为false
setPySave = false; //py
sbm.cpp我修改的部分:
sbm::System TRACK();
Control_Thread c_thread(TRACK.GetUier_()); //我是在生成TRACK对象后,传入UI的指针
capturer_->Run();
总结
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)