我遇到的问题是,我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线程更快或更慢.
我们所做的基本上是这样的:(由内存写,因为我没有在这台计算机上检查我们的代码)
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团队吹响它的地方之一.重要时刻.