2つのオプションがあります。より効率的なのは、計算を別のスレッド(または複数のスレッド、現代のPCにはほとんど存在しない単一のコアCPU)に入れることです。 JSilver's answerにはいくつかのリンクがあります。
しかし、スレッドではスレッド関連のものがたくさん出てくるので、学び、考慮する必要があります。あなたが何をしているのかわからない場合は、微妙なバグの可能性があります。だから私は、最初のステップとして、シングルスレッドの代替アプローチをお勧めします。ボーナスとして、後でマルチスレッドソリューションに移行するのがはるかに簡単になります。
QObjectのプレーンサブクラスを作成します。このQObjectに、計算の状態をメンバー変数として入力します。
上記のクラスにスロットメソッドを書き込みます。これは、計算の小さな部分を行い、その後に戻ります。良いユーザーエクスペリエンスのためには、最大で約50ミリ秒かかることがあります。ループ内の固定された回数の反復だけを使用するか、またはQElapsedTimer
を使用して時間などを計測します。そして、再度呼び出されると、このメソッドはさらに50msの計算をやり直す必要があります。計算が完了すると、この方法は、例えば、は、結果がの信号を放出することができる。
QTimer
を間隔0で追加します。タイムアウトを上記のスロット方法に接続します。ここでは間隔0は事実上Qtが可能な限り頻繁にメソッドを呼び出すことを意味します。これは、計算ができるだけ迅速に終了したいからです。しかし、メソッドがすぐに返るので、Qtはメソッドを再度呼び出す前に、他のもの(GUIの更新など)を行うことができます。
この作品たら、シングルスレッドで、あなたがしてQtのスレッドを実行し、潜在的にパフォーマンスを向上させるために、別のスレッドで生活する労働者のオブジェクトを移動することを学ぶことができます。また、スレッドの問題に遭遇した場合に備えて、比較するためのシングルスレッドのベースラインバージョンが用意されています。
あなたのコードを調べることができれば幸いです。メガバイトのメモリを割り当てているかもしれません。値が大きすぎるかもしれません。 – Mikhail
申し訳ありませんが、コードが非常に長いため、これはできません。このメッセージ+動作を一般的に停止する可能性はありますか? – user3443063
https://doc.qt.io/archives/qq/qq27-responsive-guis.html – Corristo