|
本帖最后由 ancientcc 于 2018-8-18 21:40 编辑
tprogress是用于表示进度的弹出式对话框。它可分为两种使用场景,判断哪种场景的依据是构造tprogress时传入的did_first_drawn参数是否是NULL。
did_first_drawn是NULL时,表示片断式操作下的等待
- ......
- 收到N个字节的数据
- progress_->set_percent(...);
- 系统调用了事件循环events::pump
- 收到M个字节数据
- progress_->set_percent(...);
- 系统调用了事件循环events::pump
- ......
复制代码 以上可表示网络读取至少N+M字节的数据包的过程。一次read不能收到全部数据,于是被拆为片断式的几个包,而在这几个包的中间,系统过会动调用events::pump。因为有这个events::pump,之前被set_percent弄脏的界面将被绘制。
set_percent会操作gui,因而只能在主线程被调用。如果那些操作不是在主线程,用main_->Invoke去执行set_percent。
did_first_drawn非NULL时,表示阻塞式等待
有时app要想执行个阻塞式操作,这个操作需要点时间,这时为显示进度就可用非NULL方式的tprogress。
- void ocr_controller::recognize()
- {
- gui2::tprogress dlg(null_str, boost::bind(&ocr_controller::did_recognize, this, _1), 0, false);
- dlg.show(gui_->video());
- }
- void ocr_controller::did_recognize(gui2::tprogress_& progress)
- {
- ......
- progress.set_message(...);
- ......
- progress.set_percentage(...);
- ......
- }
复制代码
以上是阻塞式等待的通用处理流程。app首先要构造tprogress,传入写有具体执行过程的参数did_recognize。接下就调用dlg.show让进入显示对话框。did_recognize写具体执行过程,中间按须夹杂set_message和set_percentage。
在逻辑上,dlg.show开始显示tprogress,执行完第一次twindow::draw后,tprogress会回调起注册的did_recognize,系统控制权就交给了did_recognize。由于阻塞在did_recognize,控制权不会再交到系统自动的events::pump,由于set_message/percentage弄脏的界面自然不会被重绘,因而相比片断式操作,此时的tprogress在处理set_message/percentage时多调用了absolute_draw。 |
|