2016-06-20 86 views
1

我正在使用QFileDialog均为getOpenFileNamegetSaveFileName。我在网络上有一个文件(慢速连接),我加载了getOpenFileName。然后,如果我尝试创建新的QFileDialog,则需要永久加载。QFileDialog慢速网络

我用Process Monitor查看了进程,我可以看到它在我上次打开文件的网络位置的每个文件中缓慢爬行。在我重新启动计算机之前它一直很慢。我能做些什么来加快速度?

下面是一些代码:

打开文件对话框

QString filename; 
QFileDialog fd(this); 
filename = fd.getOpenFileName(this,tr("Open CSV File"), ".",tr("CSV Files (*.csv)")); 

保存文件对话框

QString filename; 
QFileDialog fd(this); 
filename = fd.getSaveFileName(this,tr("Save CSV File"), ".",tr("CSV Files (*.csv)")); 

谢谢。

回答

2

不幸的是,如果您像使用本机对话框一样,那么您就可以做的其他事情。 getOpenFileName打开本机文件对话框,它是枚举目标目录中的文件的本机平台代码。

如果你不需要本机对话框,你可以做各种事情来解决阻塞/同步目录迭代接口,从根本上解决异步I/O资源问题。

+0

要迂腐,你*可以*做些什么。您可以自己重新实现这些功能,并以不同方式处理网络响应缓慢(例如,通过显示错误 - 显然无法更快地获得实际结果)。 –

+0

@JesperJuhl是的,不幸的是,大多数文件系统访问是同步的,因为操作系统的内部经常被破坏,并且完全隐藏了现实世界的异步性。所以例如通常您可以异步地从大文件中读取块,但即使您尝试将其作为重叠/异步操作执行,也会阻止读取目录内容。你可以做的最好的办法是把它全部扔进工作者线程并显示你自己的对话框,并在OS调用返回时停止线程。这是浪费和伤心。原生对话可能是异步...但不是因为VFS dir迭代不是:( –

+0

所以,正如我所说...;) –

1

尝试选项QFileDialog::DontUseNativeDialog。这应该禁止打开本机对话框。

我使用非本机对话框(通过从QFileDialog派生)多年来摆脱你描述的问题。

+0

看起来这是人们常见的问题,但在这里并没有发生帮助。我猜在这一点上的错误。 – dlams