2016-06-20 8 views
1

QFileDialog私はgetOpenFileNamegetSaveFileNameの両方を使用しています。私はgetOpenFileNameでロードするネットワーク上のファイル(低速接続)を持っています。その後、私が新しいQFileDialogを作成しようとすると、それは永遠にロードされます。QFileDialog低速ネットワーク

プロセスモニタでプロセスを調べたところ、ファイルを最後に開いたネットワーク上のすべてのファイルがゆっくりとクロールされていました。コンピュータを再起動するまでは遅くなります。これをスピードアップするために私は何ができますか?保存ダイアログ

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

はありがとうファイル

ファイルを開く]ダイアログ

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

:ここ

はいくつかのコードです。

答えて

2

あなたのようにネイティブダイアログを使用すると、残念なことに、それについては何もできません。 getOpenFileNameはネイティブファイルダイアログを開き、ターゲットディレクトリ内のファイルを列挙するこのネイティブプラットフォームコードです。

ネイティブダイアログが必要ない場合は、基本的に非同期I/Oリソースに対するブロック/同期ディレクトリ反復インターフェイスを回避するためにあらゆる種類の処理を行うことができます。

+0

賢明であるためには、何かできることがあります。機能を自分で再実装し、遅いネットワークレスポンスを別の方法で処理することもできます(たとえば、エラーを表示するなど)。実際の結果はそれ以上速く得られません。 –

+0

@JesperJuhlはい、残念ながら、ほとんどのファイルシステムアクセスは同期しています。なぜなら、OSの内部はしばしば壊れてしまい、実世界の非同期性を完全に隠すからです。だから多くの場合、大きなファイルからチャンクを非同期に読み取ることができますが、重複した/非同期操作として実行しようとしても、ディレクトリの内容を読み取ることはブロックされます。あなたができる最善のことは、すべてをワーカースレッドに投げ、独自のダイアログを表示し、OSコールが戻るときにスレッドを停止することです。それは無駄で悲しい。ネイティブのダイアログは非同期である可能性がありますが、VFSディレクトリの反復はそうではありません:( –

+0

だから、私が言ったように;) –

1

オプションQFileDialog::DontUseNativeDialogをお試しください。これにより、ネイティブダイアログを開くことを禁止する必要があります。

私は何年もの間、あなたが説明した問題を取り除くために非ネイティブダイアログ(QFileDialogから派生)を使用しています。

+0

これは人にとって共通の問題だと思われますが、ここで助けになることはありません。私はこの時点でバグを推測しています。 – dlams

関連する問題