一个QThread对象内的插槽函数可以同时运行吗?

时间:2013-11-22 00:56:16

标签: c++ qt qthread

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

class worker:public QThread
{
    run()
    {
        .......some code;

        .......some code;
    }

    slot function1()
    {
        .......some code;
        sleep(5);
        .......some code;
    }

    slot function2()
    {
        .......some code;

        .......some code;
    }
}

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

谢谢!

2 个答案:

答案 0 :(得分:2)

你问题的简单答案是肯定的,在那种情况下调用sleep会阻塞线程,因此会阻止线程消息循环中的消息被处理。

你遇到的部分问题是,除非你想重新编写Qt如何处理线程的代码,否则你不应该继承QThread。 "You're doing it wrong!"

你应该做的是创建从QObject派生的worker对象并将它们移动到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();

通过这种方式,您可以创建多个工作对象并将其中的任意数量移动到新线程,而不是坚持每个工作对象的新线程。如果您创建的线程数多于可用的处理器核心数,那么您将无法使用这些额外的线程。

您可以阅读有关how to use QThreads here的更多信息。

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

答案 1 :(得分:0)

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