C&C++   发布时间:2019-10-05  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – QT:无法从另一个线程启用套接字通知程序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个QTcpSocket,我需要控制它 – 使用多个线程写入读取.

这在QT4中工作正常但在QT5中我收到此错误,似乎只有1个线程可以同时访问套接字.如何使多个线程可以访问套接字?

基本上我想创建1个用于读取的线程和1个用于写入数据的线程,这样我就可以在其他应用程序中执行其他操作时异步读取和处理数据.

注意:回答Qt – Handle QTcpSocket in a new thread对此没有帮助,因为它描述了如何将套接字从线程1传输到线程2,然后仅从线程2使用它.我需要从两个线程中使用它.

解决方法

你只能从一个线程直接与套接字交互(线程必须运行一个事件循环 – 所以你应该在它上面调用exec()).如果要从另一个线程读取/写入,则需要使用信号/插槽.

使用默认连接类型(Qt :: AutoConnection)将一个线程上发出的信号连接到另一个线程上的对象的Slot将自动确保发生安全的线程传输(使用排队连接).您可以使用Qt :: QueuedConection显式地将信号连接到插槽,但Qt :: AutoConnection应该可以正常工作.

// Lives on thread 1
class MySocketowner : public QObject
{
    Q_OBjeCT

public:
    MySocketowner(QObject *Parent = 0)
        : QObject(Parent)
    {
        Socket = new QTcpSocket(this);
        connect(Socket,SIGNAL(readyRead()),this,SLOT(Read()));
    }

    ~MySocketowner()
    {
        delete Socket;
    }

public slots:
    void Read()
    {
        QByteArray Data = Socket->readAll();
        // Do something with the data
    }

    void Write(QBytrArray Data)
    {
        // Must always be called on thread 1
        Socket->write(Data);
    }

private:
    QTcpSocket *Socket;
};

// Lives on thread 2
class MySocketWriter : public QObject
{
    Q_OBjeCT

public:
    MySocketWriter(QObject *Parent = 0)
        : QObject(Parent)
    {
        // If this is on another thread,connection will be queued
        connect(this,SIGNAL(Write(QByteArray)),MySocketownerPointer,SLOT(Write(QBytrArray Data)));
        QByteArray Data;
        // Fill with data

        // An event gets put onto thread 1's event queue after this
        emit Write(Data);
    }

signals:
    void Write(QByteArray Data);
};

就像你问题上的评论所说的那样,你需要仔细虑为什么需要这种行为,你真的需要在两个不同的线程上读取套接字收到的相同数据吗?

大佬总结

以上是大佬教程为你收集整理的c – QT:无法从另一个线程启用套接字通知程序全部内容,希望文章能够帮你解决c – QT:无法从另一个线程启用套接字通知程序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。