2012-03-14 10 views
2

これはC++(MinGWの)、Qtの、Windows Vistaの懸念:GUI設計の問題(ビスタ)

をすべてこの中には、私はC++で非GUIアプリケーションの開発です。最近私はQtでGUIを試してみることにしました。

  • ステップ1:ロードとQMovieを使用して、背景のGIFアニメーションを表示...
  • ステップ2:

    は、ここで問題ですプロセス巨大なダンプファイル(2GBのオーバー)...私はステップ2に達したときの.so予想通り私のGUIが..

を凍結私は一方(のgetline(inputFileStream、STRINGLINE)){...}を使用していた私配置されたQCoreApplication :: processEvents();ループ内の

アプリケーションが本当に遅くなりました。だから私はそれが特定の値に達する場合にのみカウンタを配置しましたQCoreApplication :: processEvents();を実行してください。

これで、gifアニメーションは、目に見えるように変化する一連のフレームのようになりました。

processEvents()のトリガーが速くなると、アプリケーションの実行が遅くなります(これは、GUI以外の実行時間に近づくことはありません)。

Windowsタスクマネージャーから見れば、1つのコアは高い稼働率を持ち、他のコアは実行期間中に低い状態です。

どうすればよいですか?私はmutithreading(私は前にそれを使用したことはない)に掘り下げなければならない?あなたは、処理ステップのために別のスレッドを使用する必要が

class Animation; 
class FileProcessing; 

main(int argc,char** argv) { 
     QApplication* app=new QApplication(argc,argv); 
     QLabel* label1=new QLabel(...); 
     QLabel* label2=new QLabel(...); 
     Animation* objAnim=new Animation(...); //QMovie plays gif 
     objAnim->show(); 

     //fileDialogs --> ask for files..this is modal so animation is fine till this point 

     FileProcessing* objFileProcessing=new FileProcessing(...); 

     objFileProcessing->processFiles(label1,label2); //process >2GB files 
     //in this i repeatedly call processEvents() as written above 

     //delete labels,objAnim and objFileProcessing; 
     delete app; 
     return 0; 
} 
+0

あなたの問題は、あなたはまだ(UIスレッドをブロックしているということですすべての反復が終了するたびにUIを更新することは、各反復が非常に短い場合にのみ実現可能です)。関連する質問への私の答えを見てください:http://stackoverflow.com/questions/8300983/qt-programming-and-computations-which-take-long-time/8301442#8301442 –

+0

あなたのアプリが非GUIであったという事実はあなたが崩壊してはならない大きな利点です。スレッドを使用すると、Guiインターフェイスはメインアプリケーションで実行されますが、以前のアプリケーションの機能は他のスレッドで実行されるためです。 – UmNyobe

答えて

2

プログラムは次のようになります質問を説明するために、すべてをダウンストリップ。

処理スレッドに定期的にキャンセルステータス変数を確認させることができます。ユーザーがキャンセルしたい場合は、変数をtrueに設定します。処理スレッドは正常に終了することができます。

+0

彼はまた、明示的な共用メモリを避けるために信号/スロット機構を使うことができる – arne

5

スレッドを使用する方法を学び、いくつかのボールを成長させる時が来ました。 GUIは、大きなファイルを処理する関数と同じスレッド内で実行されるため、フリーズします。これらのタスクを別のスレッドで実行するように分けると、GUIは引き続き使用可能になります。

あなたはQtのに興味を持っているので、私はおよそQThreadを読んでお勧め:

+3

いくつかのボールを成長させる.... +無限大 – UmNyobe