【C++和py通信】

【C++和py通信】,第1张

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
    • `参考网址: `[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的)


2.py测试

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(); 
总结

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存