2012-11-16 40 views
1

我从以下链接中学习到,对QThread进行子类别分类并不是正确的使用方法...正确的方法是对QObject进行子类化,然后将QObject类别的对象移动到各自的线程使用moveToThread()函数...我跟着以下链接.. link 1link 2 ...但我的问题是,那么我将如何能够使用msleep()和usleep()保护静态函数?或者我会使用QTimer使线程等待一段时间?QThread:如何使用受保护的静态函数

+0

这个问题是否真的与QT有直接关系?请发布[SSCCE](http://sscce.org),说明您正在尝试解决的问题。 –

+2

他使用Qt API(QThread,QObject),所以它与Qt相关。 –

回答

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

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

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

的规范答案是“使用信号和槽。”例如,如果您希望某个线程中的QObject在一段时间后“唤醒自己”,请考虑QTimer::singleShot(),将槽作为第三个参数传递。请参阅QTimer::singleShot()。这可以从槽中调用,导致定期执行。

+0

似乎过于复杂的同步,阻止代码。 –

0

如果没有这个线程的配合,你不能让一个不同的线程休眠,这就是QThread成员函数被保护的原因。如果你想睡一个不同的线程,你需要使用一个条件变量或一个定时器内部

如果你想睡觉当前线程与usleep(),最简单的方法是继承它 - 它完全罚款只要你不要不需要QThreadPool,线程本地事件循环或类似的。

相关问题