我从以下链接中了解到,对 QThread 进行子类化不是使用它的正确方法......正确的方法是对 QObject 进行子类化,然后使用 moveToThread() 函数将 QObject 类的对象移动到相应的线程......我点击了以下链接.. 链接 1和链接 2 ...但我的问题是我将如何使用 msleep() 和 usleep() 受保护的静态函数?还是我会使用 QTimer 让线程等待一段时间?
问问题
985 次
4 回答
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
在这种情况下,它可以是成员。)
于 2012-11-16T21:53:35.780 回答
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);
于 2012-11-16T18:39:02.953 回答
1
规范的答案是“使用信号和槽”。
例如,如果您希望线程中的 QObject 在一段时间后“唤醒自己”,请考虑QTimer::singleShot(),将插槽作为第三个参数传递。这可以从有问题的插槽中调用,从而导致定期执行。
于 2012-11-16T18:40:53.800 回答
0
如果没有这个线程的合作,你不能让不同的线程休眠,这就是成员函数QThread
受到保护的原因。如果你想休眠一个不同的线程,你需要在里面使用一个条件变量或一个计时器
如果你想用 睡眠当前线程usleep()
,最简单的方法是对其进行子类化 - 只要你不需要QThreadPool
线程本地事件循环或类似的,它就很好。
于 2012-11-16T18:47:59.907 回答