我从以下链接中了解到,对QThread进行子类化是不正确的使用方法...正确的方法是将QObject子类化,然后使用moveToThread()函数将QObject类的对象移动到相应的线程...我按照以下链接.. link 1和link 2 ...但我的问题是,我将如何使用msleep()和usleep()保护的静态函数?或者我会使用QTimer使线程等待一段时间吗?
答案 0 :(得分:2)
不需要计时器。等待,Qt提供QWaitCondition。你可以实现这样的东西:
#include <QWaitCondition>
#include <QMutex>
void threadSleep(unsigned long ms)
{
QMutex mutex;
mutex.lock();
QWaitCondition waitCond;
waitCond.wait(&mutex, ms);
mutex.unlock();
}
这是正常功能。如果你愿意的话,你当然也可以把它实现为成员函数(在这种情况下它可以是static
成员。)
答案 1 :(得分:1)
一种解决方案是创建一个计时器:
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);
答案 2 :(得分:1)
规范的答案是“使用信号和插槽。”
例如,如果您希望线程中的QObject在一段时间后“自我唤醒”,请考虑QTimer::singleShot(),将插槽作为第三个参数传入。这可以从有问题的槽中调用,从而导致定期执行。
答案 3 :(得分:0)
如果没有这个线程的合作,你不能让一个不同的线程睡眠,这就是QThread
的成员函数受到保护的原因。如果你想睡一个不同的线程,你需要在
如果你想用usleep()
睡眠当前线程,最简单的方法是将它子类化 - 只要你不需要QThreadPool
,一个线程本地事件循环或类似的东西就完全没问题