将Capnproto与QTcpSocket一起使用

问题描述

我正在尝试将capnproto与qtcpsocket一起使用。 我已经stackoverflow post看到了如何将KJ事件循环与Qt的事件循环集成在一起,但是我不确定如何实现它,因为到目前为止,我仅将Qt的QTcpsocket与信号和插槽一起使用,并且从未使用自己的事件循环创建自己的线程。

我实际上已经设法将capnproto与qtcpsocket一起使用,但是这种行为有点不好,因为我将qtcpsocket与信号和插槽一起使用,并且在连接到readyRead信号的插槽中,我只是让capnproto中的KJ库使用相同的通过重写kj :: inputstream的tryRead函数,并在重写实现中调用qtcpsocket的read函数调用qtcpsocket。这通常可以正常工作,但是如果readyRead信号的频率很高,我不会总是收到所有数据。

我的替代实现如下:

class QtCapnpStream : public ::kj::InputStream,public ::kj::OutputStream  {
public:
    explicit QtCapnpStream(QTcpsocket * inputSocket),socket_(inputSocket) {};
    inline size_t tryRead(void* buffer,size_t minBytes,size_t maxBytes) override {
        size_t ret = socket_->read(static_cast<char*>(buffer),maxBytes);
        return ret;
    };
    inline void write(const void* buffer,size_t size) override {
        size_t ret = socket_->write((char*)buffer,size);
    };
private:
    QTcpsocket * socket_;
};

然后在我的客户端代码中声明此内容(在将我的socket_初始化并将其连接到主机之后)

bufferedInputStreamWrapper = new ::kj::BufferedInputStreamWrapper(new QtCapnpStream(socket_);

在连接插槽的readyRead信号的插槽中,我这样做

::capnp::PackedMessageReader reader(*bufferedInputStreamWrapper);

然后我会在插槽中进一步使用此读取器来解压缩已读取的数据。

是使这项工作成为事件循环集成(如在堆栈文章中)的唯一解决方案,还是可以以某种方式修改到目前为止所做的事情?

或者如果有人在Qt中使用过capnproto,您能给我看一个简单的例子,如何实现吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)