开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
QT 4.X
问题(Question):
目前有一个应用程式, 里面有一个大量计算的部分(至少20分钟).
此应用程式使QT, 此大量计算的部分在main thread里面. 这是因为这个程式已经很老了
后来转用QT, 但是整个架构若是要改, 会动到很底层很多东西,
所以就没有重整了 ORZ.
问题来了, 当进入大量计算时, 程式的GUI会没有反应且会"灰掉", 不论移动视窗或是
按钮都没有反应, 所以无法得知程式是死掉hang住了 还是正在计算中.
所以想用progressbar或是类似动画的东西来至少表示程式还活着,
可是都无法成功, 试过的方法如下:
以下都以progressbar为例, 其他的像是动画也是差不多结果
1. 使用QObject的Timer或是 QTimer的timer event
==> 失败, 所有的timer event都在计算完毕才进来
2. 起一个QThread, 使用连接Signal-Slot的方式来更新(定时emit signal)
==> 毫无效果. 对于连接Singal-Slot时的最后一个参数(enum Qt::ConnectionType),
试过所有种类
3. 起另一个QThread, 在run()里面起另一个event loop, 然后使用timer
再call progressbar的update() (progressbar不论在主thread或是
另外的thread结果一样)
==> 无效 (timer有发挥效果, 只是无法更新)
4. 起另一个std::thread, call update()
==> 无效
5. 在主thread使用Linux Signal Handler, 在signal handler里面更新进度并call
update() 或是call processEvent()让QT去处理在Queue里面的event.
而signal是由另外一个thread发出.
==> 可行, 但是QT的processEvent/update()会用到malloc, 会产生dead lock.
简单说 这些函式都不是Async-Signal Safe(或是非可重入的)
由以上试验看来, 似乎只能起另外一个process了, 只不过起另外一个process需要
先准备一个执行档, 不知道有没有办法像起thread一样, 可以起一个process来执行某个
函式吗?
请问各位先进, 对于上述遇到的问题是否有解法呢?
看起来, 只要main thread有大量计算, 则所有GUI相关的动作都会因为资源被占走而
延后处理.........难道只能用另一个process吗......
请各位先进不吝解惑!! 感谢!!