2011-01-15 2 views
0

私はタイムドタスクを持つリアルタイムのデータ収集アプリケーションを作ろうとしています。各タスクは、異なる更新周期または同じ更新周期を持つことができます。共通の更新期間を持つタスクをリストに格納して、そのリストを反復処理して、リストに登録した関数を呼び出すことができます。リストやベクターのようなデータ構造にコールバックを追加するにはどうすればいいですか?それらにスロットを格納することはできますか?Qtコールバック一覧

答えて

2

boost :: functionの形式でコールバック関数をlistやvectorなどのデータ構造体に追加できます。あなたは、時限タスクを持っているし、一定の間隔で繰り返すように、これらのタスクをご希望の場合は

しかし、あなたは、単にあなたのセットアップではQTimer

QList<QTimer> timed_tasks; 

のリストを格納することができ、あなたは正しい、タイマーを接続します正しいスロット機能。その後、Qtイベントループを開始します。

あなたは非常にタイトな収集プログラム実行中(すなわち、多くの長いタスクをが、リアルタイムで実行する必要がある)している場合は、別のスレッドで、あなたのスロットの機能を持っている必要があります。そうすれば、あなたのメインイベントループはまだ実行できます(そしてタスクを起動することができます)。そうしないと、時間がかかりすぎるタスクは他のタスクが枯渇します。これは、イベントループが時間通りに戻っておらず、他のタスクが実行されないためです。

またQRunnableの用語でこれらのタスクを実装し、それらを実行しますQThreadPoolを提供することができます。この道を行くなら、http://doc.qt.io/archives/4.6/threads.htmlをチェックすることをお勧めします。

UPDATE:ソリューションが同時に発射する複数のタイマーを処理する上で示唆しました。どのタイマーを起動するか(つまり、どの値を収集するか)をユーザーが制御できるようにするには、QObject :: killTimerとQObject :: startTimerを使用できます。これは、ビットテーブルまたは他の何らかのメカニズムが現在どのタイマーがアクティブであるかを記憶するための余分な記憶スペースを必要としない。

+0

これはほとんど私が望むものですが、同じ更新レートを持つ複数のタスクが存在します。私はguiで私が監視したい値を選択できるように設計しています。たぶん、収集する必要がある実際の価値を表す列挙型のリストを作成することができます。タイマーがタイムアウトすると、リストから要素を取得し、それを正しい関数を呼び出す状態マシンに送ります。 – Talguy

+0

あなたがしようとしていることに対するおそらくより良い解決策については、私のアップデートをご覧ください。 –

+0

OKだから、タイマのいずれかがトリガするたびに、QObject :: killTimerを使って関数を開始するタイムアウト関数内で、QObject :: startTimerで関数を終了する前に関数を終了する必要がありますか? – Talguy