QThreads,QObject和睡眠功能

Eri*_*gis 8 c++ qt qthread

我遇到的问题是,我QThreads根据大量文章决定实施他们应该采用的方式:
http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

并且问题在于,因为算法是在单独的QObject(包装QThread)中运行的.我该怎么称呼Thread::Sleep或者说什么呢?任何想法?

该软件的一个小描述.基本上我的申请解决了TSP(旅行商问题).随着搜索的进行,它将历史中的所有状态保存为frames...(如可视框架).搜索算法将在一个线程上运行.主线程正在使用GUI进行处理.然后有Mediaplayer类似的线程告诉Main线程在屏幕上显示什么帧.那么睡眠在哪里?在gui中有一个滑块,用户可以使用它来快进或以正常速度前进.滑块通过信号槽告诉Mediaplayer线程更快或更慢.

jal*_*alf 6

我们所做的基本上是这样的:(由内存写,因为我没有在这台计算机上检查我们的代码)

class Sleeper : public QThread {
public:
   void sleep(int ms) { QThread::sleep(ms); }
};

void sleep(int ms);

// in a .cpp file:
static Sleeper slp;

void sleep(int ms) {
    slp.sleep(ms);
}
Run Code Online (Sandbox Code Playgroud)

关键是QThread::sleep函数导致调用线程休眠,而不是QThread实例表示的threaf .所以只需创建一个通过自定义QThread子类调用它的包装器.

不幸的是,QThread是一团糟.文档告诉您错误地使用它.正如您所发现的,一些博客文章告诉您更好的方法,但是您不能调用类似的功能sleep,这些功能本来就不应该是受保护的线程成员.

最重要的是,即使您使用QThread的哪种方式,它也可以模拟可能是最糟糕的线程API(Java).与理智,boost::thread甚至更好的东西相比std::thread,它臃肿,过于复杂,不必要地难以使用,并且需要大量的样板代码.

这真是Qt团队吹响它的地方之一.重要时刻.

  • 是的,如果你在QThread中睡觉,它就无法处理事件.并非每个线程都需要处理事件.并非每个线程都有事件循环.一些线程**是**一次性线程.所以,是的,如果你不能理解什么样的应用程序需要睡在**一个线程(不一定是主线程,但*任何*线程),那么,对你有好处.在这种情况下,你生活在一个比我们中的一个人更简单的世界.:) (5认同)