我从以下链接中学习到,对QThread进行子类别分类并不是正确的使用方法...正确的方法是对QObject进行子类化,然后将QObject类别的对象移动到各自的线程使用moveToThread()函数...我跟着以下链接.. link 1和link 2 ...但我的问题是,那么我将如何能够使用msleep()和usleep()保护静态函数?或者我会使用QTimer使线程等待一段时间?QThread:如何使用受保护的静态函数
1
A
回答
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
,线程本地事件循环或类似的。
相关问题
- 1. 如何保护静态函数/变量
- 2. 如何使用受保护的/私有静态变量?
- 3. 如何在php中使用受保护的静态?
- 4. 如何在Kohana中设置受保护的静态文件3.1
- 5. ui是受保护的,但如何在重新实现的Qthread run()函数中使用它
- 6. 如何使用护照快递保护静态文件夹
- 7. 从模板化(静态)成员函数访问受保护的成员
- 8. 如何使用非静态函数内部静态函数
- 9. 从Scala调用受保护的静态Java方法
- 10. 我想用在与受保护的静态OOP
- 11. 如何在c#中调用受保护的构造函数?
- 12. Scala中的受保护函数
- 13. 受保护的内部构造函数
- 14. 保护基类的静态
- 15. 如何使用WIF来保护对静态文件的访问?
- 16. 受保护的静态成员的继承类
- 17. 使用受保护的构造函数的C++常量实例?
- 18. Esd受保护的工作站 - 如何测试我的工作站的静态?
- 19. 无法访问受保护的静态变量PHP 7.0.13
- 20. PHP从静态方法访问对象的受保护属性
- 21. 通过继承共享的静态受保护资源
- 22. 休眠使用受保护的默认构造函数失败
- 23. 有没有用于使受保护的析构函数虚拟?
- 24. 使用make_shared与受保护的构造函数+抽象接口
- 25. 使用受保护的析构函数删除对象
- 26. Tomcat保护静态内容
- 27. Java:从对象静态类使用铸造披露受保护的值
- 28. 在另一个文件中使用受保护的静态变量
- 29. 如何从Actor类继承受保护的函数?
- 30. 如何从另一个静态函数调用静态函数
这个问题是否真的与QT有直接关系?请发布[SSCCE](http://sscce.org),说明您正在尝试解决的问题。 –
他使用Qt API(QThread,QObject),所以它与Qt相关。 –