QThread:如何使用受保护的静态函数

Posted

技术标签:

【中文标题】QThread:如何使用受保护的静态函数【英文标题】:QThread:How to use protected static functions 【发布时间】:2012-11-16 18:13:19 【问题描述】:

我从以下链接中了解到,对 QThread 进行子类化并不是使用它的正确方法...正确的方法是对 QObject 进行子类化,然后使用 moveToThread() 函数将 QObject 类的对象移动到相应的线程...我按照以下链接.. link 1 和 link 2...但我的问题是我将如何使用 msleep() 和 usleep() 受保护的静态函数?还是我会使用 QTimer 让线程等待一段时间?

【问题讨论】:

这个问题真的和QT有直接关系吗?请发布SSCCE,说明您要解决的问题。 他正在使用 Qt API (QThread, QObject) 所以它与 Qt 相关。 【参考方案1】:

不需要计时器。对于等待,Qt 提供了 QWaitCondition。你可以实现这样的东西:

#include <QWaitCondition>
#include <QMutex>

void threadSleep(unsigned long ms)

    QMutex mutex;
    mutex.lock();
    QWaitCondition waitCond;
    waitCond.wait(&mutex, ms); 
    mutex.unlock();

这是一个正常的功能。如果您愿意,当然也可以将其实现为成员函数(在这种情况下,它可以是 static 成员。)

【讨论】:

【参考方案2】:

一种解决方案是创建一个计时器:

class Worker: public QObject

///...

private slots:
void doWork()

    //...
    QTimer::singleShot(delay, this, SLOT(continueDoingWork()));


void continueDoingWork()


;

有时,您只需要在不同的线程中运行一个操作,所有这些事件循环和线程都是开销。然后就可以使用QtConcurent框架了:

class Worker

public:
void doWork()

//...

 worker;

//...

QtConcurent::run(worker, &Worker::doWork);

然后,我通常使用互斥锁来模拟睡眠操作:

QMutex m;
m.lock();
m.tryLock(delay);

【讨论】:

【参考方案3】:

规范的答案是“使用信号和槽”。

例如,如果您希望线程中的 QObject 在一段时间后“自行唤醒”,请考虑 QTimer::singleShot(),将插槽作为第三个参数传入。这可以从有问题的插槽中调用,从而导致定期执行。

【讨论】:

【参考方案4】:

如果没有这个线程的合作,你不能让另一个线程休眠,这就是QThread 的成员函数受到保护的原因。如果你想休眠不同的线程,你需要在里面使用条件变量或计时器

如果你想用usleep() 让当前线程休眠,最简单的方法是对其进行子类化——只要你不需要QThreadPool、线程本地事件循环或类似的东西就可以了。

【讨论】:

以上是关于QThread:如何使用受保护的静态函数的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?

如何在同一个类的静态方法中访问类的受保护变量?

qt5:如何从 qthread 中的静态函数创建和显示自定义 qdialog

受保护的静态方法访问

静态类与受保护的构造函数

如何使用受保护的函数 setLocalPort?