可以在一个QThread对象内同时运行槽函数

Can slot functions inside one QThread object run concurrently?

本文关键字:对象 运行 函数 QThread 一个      更新时间:2023-10-16

我正在设计一个Qt应用程序,它在本地网络中执行ARP扫描。我在这里有我的线程类(伪代码):

class worker:public QThread
{
    run()
    {
        .......some code;
        .......some code;
    }
    slot function1()
    {
        .......some code;
        sleep(5);
        .......some code;
    }
    slot function2()
    {
        .......some code;
        .......some code;
    }
}

我知道sleep函数会在一定的时间内阻止它自己的调用者,但是,上面函数1中的sleep函数是否也会阻止其他两个,因为它们属于一个QThread对象?功能1和功能2是仅由连接的信号触发的插槽。

谢谢!

问题的简单答案是肯定的,在这种情况下调用sleep将阻塞线程,从而阻止线程消息循环中的消息被处理。

您遇到的部分问题源于这样一个事实,即除非您想重写Qt如何处理线程的代码,否则不应该继承QThread。"你做错了!"

您应该做的是创建从QObject派生的工作对象,并将它们移动到QThread:-

class WorkerObject : public QObject
{
    Q_OBJECT
    public:
        WorkerObject(QObject* parent = NULL);
    private:
    private slots:
        void DoWork();
};

QThread* thread = new QThread;
WorkerObject* worker = new WorkerObject(parent);
worker->moveToThread(thread);
// Qt 5 connect syntax
connect(thread, &QThread::started, worker, &WorkerObject::DoWork);
connect(thread, &QThread::finished, thread, &QThread deleteLater);
thread->start();

通过这种方式,您可以创建多个工作对象,并将任意数量的工作对象移动到新线程,而不是坚持每个工作对象都有一个新线程。如果您创建的线程数量超过了可用处理器内核的数量,那么使用这些额外的线程将不会带来好处。

您可以在这里阅读更多关于如何使用QThreads的信息。

最后,如果您不得不在线程中调用sleep,那么您的设计可能是错误的。如果你想等待,也许使用QMutex会是一个更好的选择。

答案取决于连接类型。如果在同一线程拥有的两个对象之间建立连接,则它们将不会并发。如果在不同线程上创建的两个对象之间建立连接,则它们可以是并发的。