QT学习之事件处理(二) 处理密集响应时的响应保持
2013-11-18 14:42
381 查看
当处理一个事件时,也可能会同时产生一些其它的事件,如果再处理一个特定的事件上耗费的时间比较多,那么用户界面就会变得无法响应。例如,在应用程序中把一个文件保存到磁盘中,直到文件保存完毕,才会处理那些由于窗口系统产生的事件。在文件保存的过程中,应用程序就不能响应来自窗口系统的重新绘制请求。
一种解决方法当然是用多线程:一个线程用于处理应用程序的界面,另外一个程序则执行文件操作。
另外一种更为简单的方式是在文件保存的代码中频繁调用QApplication::processEvents();这个函数告诉QT处理那些所有还没有被处理的各类事件,然后再将控制权返还给调用者,使用这种方式存在一个潜在的问题,即用户也学在应用程序中还在保存文件就关闭了,或者甚至在保存文件的时候又单击了一次File->save,这样就可能产生意外的后果,最简单的解决方式是将processEvents()替换为processEvents(QEventLoop::ExcludeUserInputEvents);
除使用多线程和QProcessDialog之外,还有一种处理长时间运行操作的完全不同的方式,在QT中,通过使用一个0毫秒定时器,只要没有其它尚未处理的事件,就可以触发这个定时器
总结下就是QT中解决上述问题有三种方式 1:多线程 2:在处理耗时事件时频繁调用QApplication::processEvents 3:启动0毫秒定时器,推迟处理
一种解决方法当然是用多线程:一个线程用于处理应用程序的界面,另外一个程序则执行文件操作。
另外一种更为简单的方式是在文件保存的代码中频繁调用QApplication::processEvents();这个函数告诉QT处理那些所有还没有被处理的各类事件,然后再将控制权返还给调用者,使用这种方式存在一个潜在的问题,即用户也学在应用程序中还在保存文件就关闭了,或者甚至在保存文件的时候又单击了一次File->save,这样就可能产生意外的后果,最简单的解决方式是将processEvents()替换为processEvents(QEventLoop::ExcludeUserInputEvents);
除使用多线程和QProcessDialog之外,还有一种处理长时间运行操作的完全不同的方式,在QT中,通过使用一个0毫秒定时器,只要没有其它尚未处理的事件,就可以触发这个定时器
总结下就是QT中解决上述问题有三种方式 1:多线程 2:在处理耗时事件时频繁调用QApplication::processEvents 3:启动0毫秒定时器,推迟处理
相关文章推荐
- Qt 学习(8)Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针(转)
- QT学习之事件处理(一)
- qt焦点事件响应捕捉处理,事件过滤器
- [Q学习]10 Qt事件系统——处理事件
- 【Qt学习笔记】4.事件处理
- QT学习之事件处理
- QT中窗口刷新事件的学习总结
- [ASP.NET学习笔记之二十一]ASP.NET中的事件处理
- QT之GUI学习笔记(十五)----事件接收与忽略
- qt练习11 鼠标,按键,滚轮事件学习
- iOS-事件响应链的学习
- Qt处理平台相关事件的方式
- QT中窗口刷新事件的学习总结
- 轻松学习JavaScript二十八:DOM编程学习之事件处理函数
- CCMenu超过CCScrollView边框还能点击处理,以及拖动CCMenuItem不响应点击事件
- Qt事件处理
- Netty源码学习-ServerBootstrap启动及事件处理过程
- QT 不能响应mouserelease事件
- javascript学习四: 事件处理
- Qt事件处理小应用之KeyGame