2017-04-25 4 views
0

私は長い計算に関する質問を持っている時に:QtのC++「慧音Rückmeldung」 - GUIでエラーが発生しました長い計算

長い計算が行われるかもしれない私のGUIのいくつかのタスクを実行中。これは問題ではなく、ちょっと時間がかかります。すべてうまく動作します(少なくとも結果は問題ありません)。私を悩ます何

は、一定時間後に私のGUIが応答していないようだということです。たとえば、計算中に示されている私のProcessBarが表示され、私のGUIのタイトルバーのテキスト「慧音Rückmeldung」にされることはありませんが追加されました(これはビジー、クラッシュなど)。申し訳ありませんが、インターネット上でその問題について何かを見つけるのが難しい正しい翻訳がわかりません。

この動作を停止する可能性はありますか?

ありがとうございます。

+0

あなたのコードを調べることができれば幸いです。メガバイトのメモリを割り当てているかもしれません。値が大きすぎるかもしれません。 – Mikhail

+0

申し訳ありませんが、コードが非常に長いため、これはできません。このメッセージ+動作を一般的に停止する可能性はありますか? – user3443063

+2

https://doc.qt.io/archives/qq/qq27-responsive-guis.html – Corristo

答えて

1

2つのオプションがあります。より効率的なのは、計算を別のスレッド(または複数のスレッド、現代のPCにはほとんど存在しない単一のコアCPU)に入れることです。 JSilver's answerにはいくつかのリンクがあります。

しかし、スレッドではスレッド関連のものがたくさん出てくるので、学び、考慮する必要があります。あなたが何をしているのかわからない場合は、微妙なバグの可能性があります。だから私は、最初のステップとして、シングルスレッドの代替アプローチをお勧めします。ボーナスとして、後でマルチスレッドソリューションに移行するのがはるかに簡単になります。

  1. QObjectのプレーンサブクラスを作成します。このQObjectに、計算の状態をメンバー変数として入力します。

  2. 上記のクラスにスロットメソッドを書き込みます。これは、計算の小さな部分を行い、その後に戻ります。良いユーザーエクスペリエンスのためには、最大で約50ミリ秒かかることがあります。ループ内の固定された回数の反復だけを使用するか、またはQElapsedTimerを使用して時間などを計測します。そして、再度呼び出されると、このメソッドはさらに50msの計算をやり直す必要があります。計算が完了すると、この方法は、例えば、は、結果がの信号を放出することができる。

  3. QTimerを間隔0で追加します。タイムアウトを上記のスロット方法に接続します。ここでは間隔0は事実上Qtが可能な限り頻繁にメソッドを呼び出すことを意味します。これは、計算ができるだけ迅速に終了したいからです。しかし、メソッドがすぐに返るので、Qtはメソッドを再度呼び出す前に、他のもの(GUIの更新など)を行うことができます。

この作品たら、シングルスレッドで、あなたがしてQtのスレッドを実行し、潜在的にパフォーマンスを向上させるために、別のスレッドで生活する労働者のオブジェクトを移動することを学ぶことができます。また、スレッドの問題に遭遇した場合に備えて、比較するためのシングルスレッドのベースラインバージョンが用意されています。

2

GUIがフリーズするのを防ぐために、高価で長持ちする計算をGUIスレッドからワーカースレッドに委託する必要があります。

のQtドキュメント:How To Really, Truly Use QThreads

GUI自体は、ワーカースレッドから変更することはできません:私は重宝QThread使用頻度のThreading Basics

良い説明。メインのスレッドにデータ変更についてのnotifyを与え、そこでGUIを更新する必要があります。

関連する問題