3

シミュレーションを行い、結果をレンダリングするアプリケーションがあります。レンダリングが非常に遅くなる場合があるため、レンダリングを別のスレッドに分割し、gtk_widget_queue_draw準備ができたらメイン スレッドを呼び出します。まだ描画が終わっていない場合、余分なリクエストは破棄されます (queue_draw無効にするだけであり、「さらに」無効にすることは不可能であるため)。

その結果、大規模で複雑なシステムでは、シミュレーションがスレッドを最大化し、レンダリングが別のスレッドを最大化し、すべてが機能します。

別の問題に遭遇したばかりで、なぜそれが起こっているのかわかりません。十分に単純なシミュレーションとレンダリング (6 つの 5 ポイント ライン) で壊れてしまいます。

最初の数ステップ (60 から 400 くらいまでどこでも見たことがあります) は、1 つのステップが 2 回レンダリングされるまで、(ほんの一瞬で) うまくレンダリングされます。その後queue_draw、ウィンドウをレンダー ウィンドウ上にドラッグするなどの操作を行うまで無視し、その後再起動します (再び壊れるまで)。

リクエストを人為的に遅くした場合(usleep(10000)十分です)、これは起こりません。

ただし、表示のプロセスが通常のシミュレーション スレッドに干渉することは許可されていないため (遅延やミューテックスなど)、これはまったく受け入れられないソリューションです。揮発性データを処理していることを考えると、レンダー スレッドを「可能な限り」実行させるソリューションが必要です。完全に正確である必要はありません。レンダリングが行われる限り、フレームが少し間違ってレンダリングされても (フレーム i の半分、i+1 の半分で問題ありません)、まったく気にしません。

なぜこれが起こっているのですか?どうすれば修正できますか?

4

2 に答える 2

0

gdk_threads_enter/gdk_threads_leave でスレッド内の UI 呼び出しをロックしましたか? コードサンプルを追加することも役立つかもしれません...

于 2012-11-29T00:41:56.850 に答える