在View层,我们不可避免的需要一些多线程的控制,但是,却又没有达到抽象出一个线程给程序全局使用的程度,这个线程仅仅只需要负责本view内部的操作,这个线程的生命周期一般短于view的生命周期。所以,我们需要一个简单的方式。这里主要涉及到如下几种需求:
时间短,即使多算一遍、几遍也无所谓;
时间很久,没必要完成前一次;
时间不一定,但是需要排队;
对于第一种需求,我们可以使用Future工具类,或者std::thread func并detach,避免写一个单独的thread subclass,不需要关心new/delete问题。然后让线程通知主UI线程,这里可以不使用Qt的信号槽机制,而是采用主动刷新机制,在view的事件callback函数中检查线程计算是否完成,然后由UI主线程主动读取线程保存的结果,刷新到控件上;或者也可以采用Qt的信号槽机制,先connect一个跨线程的connection,然后在view下一次事件循环中,首先更新view。因为线程对象只能在 slot 中被访问,所以,除了线程、主线程共享对象,否则难以控制该线程。
template<typename R>
bool is_ready(std::future<R> const& f)
{ return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
对于第二种情况,我们就需要在view中持有这个线程,那么,我们就需要关心线程是