シミュレーションを行い、結果をレンダリングするアプリケーションがあります。レンダリングが非常に遅くなる場合があるため、レンダリングを別のスレッドに分割し、gtk_widget_queue_draw
準備ができたらメイン スレッドを呼び出します。まだ描画が終わっていない場合、余分なリクエストは破棄されます (queue_draw
無効にするだけであり、「さらに」無効にすることは不可能であるため)。
その結果、大規模で複雑なシステムでは、シミュレーションがスレッドを最大化し、レンダリングが別のスレッドを最大化し、すべてが機能します。
別の問題に遭遇したばかりで、なぜそれが起こっているのかわかりません。十分に単純なシミュレーションとレンダリング (6 つの 5 ポイント ライン) で壊れてしまいます。
最初の数ステップ (60 から 400 くらいまでどこでも見たことがあります) は、1 つのステップが 2 回レンダリングされるまで、(ほんの一瞬で) うまくレンダリングされます。その後queue_draw
、ウィンドウをレンダー ウィンドウ上にドラッグするなどの操作を行うまで無視し、その後再起動します (再び壊れるまで)。
リクエストを人為的に遅くした場合(usleep(10000)
十分です)、これは起こりません。
ただし、表示のプロセスが通常のシミュレーション スレッドに干渉することは許可されていないため (遅延やミューテックスなど)、これはまったく受け入れられないソリューションです。揮発性データを処理していることを考えると、レンダー スレッドを「可能な限り」実行させるソリューションが必要です。完全に正確である必要はありません。レンダリングが行われる限り、フレームが少し間違ってレンダリングされても (フレーム i の半分、i+1 の半分で問題ありません)、まったく気にしません。
なぜこれが起こっているのですか?どうすれば修正できますか?