从阅读这篇 blog , 这个blog和其他一些,子类化 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 类中)也在主线程中。所以我无法启动定时器或连接 socket 。
如果我尝试将 QTimer 和 QTcpSocket 移动到线程(例如,通过传递线程指针在构造函数中),当我离开应用程序时,这会变得非常困惑。
我该怎么办?
最佳答案
类实例在调用线程上创建。
QTimer
继承QObject
。
如果调用 exec()
,Qt
上的每个线程都可以有一个事件循环。
所以您想将 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
Initialise函数;在调用 Run()
之前,您应该在此处创建和设置 QTcpSocket
和 QTimer
对象。由于 CommsHandlerIP
在创建这些对象之前在新线程中运行,因此它们也将共享相同的线程关联。
关于c++ - 通过 QTimer 和 QTcpSocket 正确使用 QThread 和 moveToThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252608/