QT学习之事件处理(二) 处理密集响应时的响应保持

来源:互联网 发布:mac系统如何回到桌面 编辑:程序博客网 时间:2024/06/05 00:43



当处理一个事件时,也可能会同时产生一些其它的事件,如果再处理一个特定的事件上耗费的时间比较多,那么用户界面就会变得无法响应。例如,在应用程序中把一个文件保存到磁盘中,直到文件保存完毕,才会处理那些由于窗口系统产生的事件。在文件保存的过程中,应用程序就不能响应来自窗口系统的重新绘制请求。

一种解决方法当然是用多线程:一个线程用于处理应用程序的界面,另外一个程序则执行文件操作。

另外一种更为简单的方式是在文件保存的代码中频繁调用QApplication::processEvents();这个函数告诉QT处理那些所有还没有被处理的各类事件,然后再将控制权返还给调用者,使用这种方式存在一个潜在的问题,即用户也学在应用程序中还在保存文件就关闭了,或者甚至在保存文件的时候又单击了一次File->save,这样就可能产生意外的后果,最简单的解决方式是将processEvents()替换为processEvents(QEventLoop::ExcludeUserInputEvents);

除使用多线程和QProcessDialog之外,还有一种处理长时间运行操作的完全不同的方式,在QT中,通过使用一个0毫秒定时器,只要没有其它尚未处理的事件,就可以触发这个定时器





总结下就是QT中解决上述问题有三种方式 1:多线程 2:在处理耗时事件时频繁调用QApplication::processEvents 3:启动0毫秒定时器,推迟处理

原创粉丝点击