timer
が のオブジェクトで、タイマーQTimer
の間隔が でiInterval
、タイマーのタイムアウト信号がスロット に接続されているとしsltTimeout()
ます。
iInterval
実行にかかる時間よりも小さい場合はどうなるかを考えていsltTimeout()
ました。その結果、複数のスレッドが実行sltTimeout()
されますか? その場合、オブジェクトへの非同期アクセスで問題が発生する可能性があります。
誰でもそれを明確にできますか?
timer
が のオブジェクトで、タイマーQTimer
の間隔が でiInterval
、タイマーのタイムアウト信号がスロット に接続されているとしsltTimeout()
ます。
iInterval
実行にかかる時間よりも小さい場合はどうなるかを考えていsltTimeout()
ました。その結果、複数のスレッドが実行sltTimeout()
されますか? その場合、オブジェクトへの非同期アクセスで問題が発生する可能性があります。
誰でもそれを明確にできますか?
AQTimer
は、それが開始されたスレッドで実行されます。1 つのスレッドでしか実行されないためtimeout()
、前のスロット関数が戻る前にシグナルを複数回発行することはできません。
QTimerのドキュメントから:
Qt は、タイマーのスレッド アフィニティを使用して、どのスレッドが timeout() シグナルを発行するかを決定します。
その結果、複数のスレッドが sltTimeout() を実行しますか?
自動的に実行されないので、いいえ。必要に応じて、たとえば計算を行っている場合は、そのようにする必要があります。
その場合、オブジェクトへの非同期アクセスで問題が発生する可能性があります。
はいといいえ。
この場合は特別なことではなく、一般的なスレッド プログラミングです。QMutex、QMutexLocker、QSemaphore などのスレッド同期プリミティブを使用する必要があります。
できるもう 1 つのトリックは、スロットが処理されているときにタイマーの呼び出しを停止することですが、これには妥協したくない場合があります。
イベントはデフォルトでキューに入れられることを忘れないでください。そのため、次の実行で sltTimeout の前回の実行に依存しない場合は、「十分な時間があれば」スレッド化を無視して実行することもできます。後続の呼び出し間に依存関係がある場合は、そうです、コードを賢くする必要があります。