通过阅读本博客,本博客以及其他一些文章,对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函数;在这里,您应该在调用之前创建和设置QTcpSocket
和QTimer
对象Run()
。由于CommsHandlerIP
是在创建这些对象之前,在新的线程中运行,他们也将共享相同的线程关联性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句