• 1043阅读
  • 0回复

[提问]QFileSystemModel 网络路径 效率优化 [复制链接]

上一主题 下一主题
离线waterarmy
 

只看楼主 倒序阅读 楼主  发表于: 2022-10-24
目前使用QFileSystemModel加一些Qt内部的view,实现了一个文件对话框,但发布后用户反馈了各种效率问题,会卡顿几十秒甚至一两分钟。主要表象包括两点(但其实都是由于底层调用了GetFileAttributesEx这个接口导致。Qt会在底层很多接口,像QFileInfo类的诸多对外接口中使用此系统函数,所以应当尽量将其放在额外线程中调用):
  • 访问的某个路径下包含一个指向无效ip的快捷方式:底层调用了系统接口GetFileAttributesEx尝试获取文件属性,造成IO阻塞(尝试搜索快捷方式指向的地址)。大家可以看下此链接,总结下来的解决方案是在可能造成IO阻塞的时间段内,另开一个线程每隔一段时间调用CancelSynchronousIo 取消IO阻塞,但发送时间间隔过短可能会导致其他一些正常流程出问题。
  • 访问某个本地局域网ip目录,该目录下包含大量文件(上千的体量):较为高频地调用GetFileAttributesEx,若是网速不够稳定,则会造成较大效率损耗。
需要注意的是:不具有修改Qt源码的权限,所以无法通过修改Qt源码的方式解决。
但考虑到windows系统对话框访问效率很高,总觉得有方式可以优化,即使自己重写QAbstractItemModel,但目前想着先以使用QFileSystemModel为首要选择,看是否有其他优化方案。
当前已经想到的一些优化方式:
  • 一些自定义功能代码里,一定不要使用下面这种直接使用构造函数去构造对象的方式,而是统一借用我们实现功能里声明的QFileSystemModel对象的fileInfo接口去获取。因为Qt在内部做了cache,可以看下Qt源码中关于 qfileinfo.cpp中,有很多接口都去调用了fillMetaData去做数据填充。所以直接用一个已经做过很多文件数据填充的model对象去获取这些fileInfo会更有利于效率。在访问本地server环境时尤为显著。
    1. [li]QString filePath;[/li][li]QFileInfo fileInfo(filePath);[/li][li]/* use fileInfo to do something like calling isDir(), exists() */[/li]


新人第一次发帖~欢迎有遇到类似场景问题的朋友来一起讨论下~



快速回复
限100 字节
 
上一个 下一个