1

私は、ライブデータがアプリケーションのビューアに表示されるcustumQGISアプリケーションの構築に携わってきました。

使用されているIPCはUNIXメッセージキューです。

データは、指定された間隔、たとえば3秒で更新されます。

今私が直面している問題は、表示されるデータの処理に3秒以上かかることです。したがって、アプリが次の更新のためにデータの処理を開始する前に、QTimerの更新が停止されます。データが処理された後、QTimerを再起動します。アプリは、更新/更新後(この更新中にアプリが応答しなくなる)、ユーザーがアプリでの作業を継続するための十分な時間を確保できるように動作する必要があります。データが更新されているのを確認します.1つのシナリオで、ユーザーが作業するための許容可能な一時停止を取得できます。

ただし、異なるOS(RHEL5.0からRHEL5.2)では、状況が異なります。タイマーがワイルドになり、連続する更新の間に一時停止を与えることなく起動し続けるため、無限ループになります。この更新データの処理には、間違いなくより長い時間がかかります。 3秒ですが、そのために停止しました-処理中にタイマーを再起動しました..同じロジックが1つのシナリオで機能し、他のシナリオでは機能しません..私が観察した他の事実は、タイマーのこの迅速な起動時にリフレッシュ機能が終了するまでにかかる時間は約300msと非常に短いため、この機能の開始と終了に設定したタイマーの開始と停止は、実際の処理の前にその短い時間で発生します。データが終了し、実行を待機しているキュー内のタイマーの開始は3〜4回であるため、連続する更新のたびに、その時点から無限ループの問題が悪化します。

ここで重要なのは、1つのOSの同じコードの場合、更新時間は約4000ms(同じ量のデータにかかる実際の処理時間)であるのに対し、他のOSの場合は300msであるということです。

多分これは更新されたOSの新しいライブラリと関係があります..しかし、なぜそれがそのように起こっているのか手がかりを得ることができないので、私はそれをデバッグする方法がわかりません...多分pthreadsに関連する何かが白黒に変更されましたOS ??

だから、私のクエリは、QTimerは私が望むものを達成するための良いオプションではないと思うので、QTimerを使用せずにアプリの一部の処理がタイマー化される(そしてOSから独立している)ことを保証する方法はありますか?

どのようなオプションがありますか?pthreadまたはBoostスレッド?スレッドを代替として使用する場合はどちらが良いでしょうか??しかし、更新処理にどれだけ時間がかかっても、連続する更新で少なくとも3秒のギャップを確保するにはどうすればよいですか?

親切に助けてください。

ありがとう。

4

1 に答える 1

1

許容できる長期的な解決策を見つけようとしている場合は、別のスレッドでディスプレイの更新を調査します. そのスレッドでは、表示を画像にペイントして、必要な頻度で更新できます... ただし、スレッドを調整して、利用可能なすべての処理時間を消費しないようにすることもできます。次に、UI スレッドで、その画像を読み取り、画面に描画できます。これにより、画像のさまざまな部分を表示できるため、パンに対する応答性が向上する可能性があります。タイマーに基づいて 3 秒ごとに画像を更新する (ソースから再描画するだけ) か、新しいデータが完全に更新されるたびに他のスレッドに信号を送信させることができます。

于 2009-09-09T20:01:50.327 に答える