繁体   English   中英

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

[英]QThread:How to use protected static functions

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

不需要计时器。 等待,Qt提供QWaitCondition。 你可以实现这样的事情:

#include <QWaitCondition>
#include <QMutex>

void threadSleep(unsigned long ms)
{
    QMutex mutex;
    mutex.lock();
    QWaitCondition waitCond;
    waitCond.wait(&mutex, ms); 
    mutex.unlock();
}

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

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

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);

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

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

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

如果你想用usleep()睡觉当前线程,最简单的方法是将它子类化 - 只要你不需要QThreadPool ,一个线程本地事件循环或类似的东西就完全没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM