[英]QThread:How to use protected static functions
不需要计时器。 等待,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.