2011-10-31 32 views
0

今朝Qtimerの周りに私の頭を包み込むのに少し問題があります。私はボタンをクリックすることにより開始されQTimerを持って遅れたQTimerが始まる?

は、ここで基本的な考え方です。 アクティブになったら、5分ごとに関数を呼び出します(start()と呼ぶ)。

スタートは()QtConcurrentを使用して(()が動作し、それを呼び出す)別々の関数を呼び出します。したがって、処理がまだ発生していても、すぐに戻ります。

ここに私の問題だ: 私は(仕事を呼びたい)一度他の後の回数、。私の問題は、現時点では、処理が終了する前にwork()関数を複数回呼び出すことです。ハードウェアとのインターフェイスは機能しないためです。

これについてはどうすればよいですか?

編集:ここでは

は、プログラムの基本的な流れである:

  • ユーザーは、()startTimerをクリックします。
  • のStartTime()スタート(
  • )タイマーが信号を発するとき、それは(スタートを呼び出し
  • )(timer->スタート呼び出すには)ありません 未来= QtConcurrent ::走行を行い、その後、いくつかの光UIのものを行います(...仕事()...)//作業に長い時間を要する watcher-> setFuture(*未来)
  • 何とか(これは私の問題である)、仕事()が実行されたとき、私はそれを呼びたいですもう一度(正確には4回)

答えて

2

あなたの質問が正しく理解されている場合は、work()関数を実行しないようにしてください複数のスレッドで同時に実行できます。

work()関数の先頭にQMutexLockerを使用し、対応するQMutexをクラス定義に追加します。

前回の実行が完了するまでwork()関数の実行がブロックされますこの方法です。

+0

うーん、いいですね:この方法では、あなたがの洪水とすべてを一度に実行することができQTimerメッセージの大きなまでブロックされたキューで巻き取るの可能性を持っていません。しかし、実行が終了したら(そしてすぐにwork()を直ちに呼び出す)ために、どのようにチェックすべきですか? – hex4def6

+0

作業関数の先頭にmutexlockerがあると、work()が終了するとmutexが呼び出されます。実行中、他のすべてのスレッドはwork()関数の先頭でブロックされます。ミューテックスがロック解除されるとすぐに、最初の待機中のスレッドがロックして実行を開始します。詳細については、[Qtスレッドの同期](http://doc.qt.nokia.com/latest/threads-synchronizing.html)を参照してください。 – pnezis

+0

ohhなので、 "実行が拒否されました"よりも実行が遅い – hex4def6

0

何らかの理由でwork()の機能に異常が20分かかる場合は、できるだけ早く次の4つのwork()コールバックを実行したいと考えていますか、それでもなお5分の間隔を空けておきたい遅延?

実際に5分の間隔がの場合は、作業項目を完了するたびに再度キューに入れられるワンショットタイマーを使用する必要があります。

http://doc.qt.io/qt-4.8/qtimer.html#singleShot-prop

関連する問題