通过QTimer和QTcpSocket正确使用QThread和moveToThread

染料

通过阅读本博客,本博客以及其他一些文章,对QThread进行子类化是不好的做法。因此,我尝试应用此方法。

但是我的问题是我想移到另一个线程中的类中有一个QTimer和QTcpSocket。突然,它不像所使用的示例那样简单。:(

QThread m_commsThread;
m_pICommsHandler = new CommsHandlerIP();
m_pICommsHandler->moveToThread(&m_commsThread);
m_commsThread.start();

这是CommsHandlerIP类,不包括方法。

class CommsHandlerIP : public QObject
{
    Q_OBJECT
public:
    CommsHandlerIP();
    ~CommsHandlerIP(void);
protected:
    QTcpSocket m_TCPSocket;
    QTimer m_timer;
}

问题是,即使您移动CommsHandlerIP,QTimer和QTcpSocket(在CommsHandlerIP类内部)也位于主线程中。因此,我无法启动计时器或连接插座。

如果我尝试将QTimer和QTcpSocket移到MoveToThread(例如,通过传递线程指针在构造函数内部),则在离开应用程序时,这会变得非常混乱。

我应该怎么办?

黑暗骑士

类实例是在调用线程上创建的。QTimer继承QObject如果每个线程Qt都调用,则可以有一个事件循环exec()所以您想转到QTimer另一个线程上的事件循环。因此您应该手动移动它。

因此,将其创建延迟到移动对象之后:-

class CommsHandlerIP : public QObject
{
    Q_OBJECT

    public slots:
       void Initialise();

    private: 
       void Run();

       // c++ 11, initialising in headers...
       QTimer* m_pTimer = NULL;
       QTcpSocket* m_pSocket = NULL;   
};

void CommsHandlerIP::Initialise()
{
     m_pTimer = new QTimer(this);
     m_pSocket = new QTcpSocket(this);

     Run();
}

QThread m_commsThread;
m_pICommsHandler = new CommsHandlerIP();

// Note Qt 5 connect style
connect(&m_commsThread, &QThread::started, m_pICommsHandler, &CommsHandlerIP::Initialise);
m_pICommsHandler->moveToThread(&m_commsThread);
m_commsThread.start();

启动线程时,将调用CommsHanderIP Initialize函数;在这里,您应该在调用之前创建和设置QTcpSocketQTimer对象Run()由于CommsHandlerIP是在创建这些对象之前,在新的线程中运行,他们也将共享相同的线程关联性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用moveToThread()在pyqt中正确使用QThread?

来自分类Dev

如何使用pytest正确退出队列和Qthread进行测试?

来自分类Dev

如何使用matplotlib和pyplot正确实现QThread

来自分类Dev

如何正确删除和终止QThread

来自分类Dev

通过Lambda和递归函数调用了解QTimer

来自分类Dev

QThread-使用moveToThread将类成员移动到线程

来自分类Dev

如何通过Jest正确使用Promises和Timers

来自分类Dev

QThread和QML锁定

来自分类Dev

QTimer :: singleShot和QMetaMethod :: invoke

来自分类Dev

QSlider,QTimer和valueChanged用法

来自分类Dev

qtimer和opencv运行缓慢

来自分类Dev

QSlider,QTimer和valueChanged用法

来自分类Dev

moveToThread()和start()可以与未构造的对象一起使用吗?

来自分类Dev

QThread 与 QTimer 连接问题

来自分类Dev

正确使用QThread.currentThreadId()

来自分类Dev

使用QThread时发生类型转换和QThreadStorage警告?

来自分类Dev

使用QThread时发生类型转换和QThreadStorage警告?

来自分类Dev

QThread和GUI线程说明

来自分类Dev

更改textlabel和qthread pyqt

来自分类Dev

使用QIODevice的阻止接口(QTcpSocket和QFile)时何时检查错误

来自分类Dev

正确使用Vuex和Vuelidation的正确方法

来自分类Dev

正确使用for循环和promise

来自分类Dev

正确使用等待和异步

来自分类Dev

正确使用<use>和<svg>

来自分类Dev

正确使用MIN和NULLIF

来自分类Dev

正确使用ForkManager和Perl?

来自分类Dev

正确使用MVVM和命令

来自分类Dev

通过PowerShell使用FFmpeg-正确在参数中使用破折号和引号

来自分类Dev

在QTimer Singleshot之后终止QThread