2016-06-20 3 views
1

Я использую QFileDialog как getOpenFileName, так и getSaveFileName. У меня есть файл в сети (медленное соединение), который я загружаю с getOpenFileName. Затем, если я попытаюсь создать новый QFileDialog, он навсегда загружается.QFileDialog Медленная сеть

Я просмотрел процесс с помощью Process Monitor, и я вижу, как он медленно просматривает каждый файл в сетевом расположении, где я последний раз открывал файл. Он остается медленным, пока я не перезагрузите компьютер. Что я могу сделать, чтобы ускорить это?

Вот код:

Open File Dialog

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 открывает диалог родного файла, и именно этот код собственной платформы перечисляет файлы в целевом каталоге.

Если вам не нужен собственный диалог, вы можете делать всевозможные действия, чтобы обойти блокирующий/синхронный интерфейс итерации каталогов на принципиально асинхронные ресурсы ввода-вывода.

+0

Чтобы быть педантичным, вы можете * что-то сделать. Вы можете повторно реализовать функциональность самостоятельно и обрабатывать медленные сетевые ответы по-разному (например, показывая ошибку - очевидно, что вы не сможете быстрее получить фактические результаты). –

+0

@JesperJuhl Да, и, к сожалению, большинство доступа к файловой системе синхронно, потому что внутренности ОС часто нарушаются и полностью скрывают асинхронность реального мира. Так, например, часто вы можете читать фрагменты из большого файла асинхронно, но чтение содержимого каталога будет блокироваться, даже если вы попытаетесь выполнить его как операцию перекрытия/асинхронности. Лучшее, что вы можете сделать, это бросить все это в рабочий поток и показать свой собственный диалог и остановить поток при возврате вызова ОС. Это расточительно и грустно. Родные диалоги могут быть асинхронными ... но не с тех пор, как итерация VFS не является :( –

+0

Итак, как я уже сказал ...;) –

1

Пробуйте опцию QFileDialog::DontUseNativeDialog. Это должно запретить открыть собственный диалог.

Я использую неродные диалоги (путем получения QFileDialog) в течение многих лет, чтобы избавиться от описанных вами проблем.

+0

Похоже, это распространенная проблема для людей, но здесь не помогает. На данный момент я догадываюсь об ошибке. – dlams

Смежные вопросы