c++ - 通过 QTimer 和 QTcpSocket 正确使用 QThread 和 moveToThread

标签 c++ multithreading qt qthread

从阅读这篇 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() 之前,您应该在此处创建和设置 QTcpSocketQTimer 对象。由于 CommsHandlerIP 在创建这些对象之前在新线程中运行,因此它们也将共享相同的线程关联。

关于c++ - 通过 QTimer 和 QTcpSocket 正确使用 QThread 和 moveToThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252608/

相关文章:

c++ - 如何在不创建实例的情况下调用类方法

c++ - C++ 模板函数的重载错误

c++ - fatal error LNK1104 : cannot open file 'libboost_regex-vc90-mt-gd-1_42.lib'

c++ - std::thread 类与 C++ 中的 std::this_thread 命名空间?

javascript - JavaScript 支持多线程吗?

c++ - 如何定义两个相互依赖的类,最好是在同一个头文件中?

c++ - qt类内的服务器线程(需要互斥体吗?)

c++ - QTableView 比它的容器大

c++ - 在 qt 中的绘图中拖动误差条

c++ - 在未安装 Qt 的计算机上运行 Qt 应用程序。 QCamera 看不到可用的设备