杉田です。
> 2016/10/12 17:07、imudak <imudak@gmail.com>のメール:
>
> はじめまして。imudakです。よろしくお願いします。
>
> ずっと悩んでいることがあるのですが、
> signal/slot通信で、同一シグナルの連続発行を止められないでしょうか。
> 想定ケースは、例えばボタン連打、周期取得処理などです。
>
> (ボタン連打)
> [UI] [Model]
> | |
> |--requestInc--------->|
> | |-- begin: incrementの処理開始
> | |
> |--requestInc(2回目)-->|
> | |
> | |
> |--requestInc(3回目)-->|
> | ... |
> |--requestInc(n回目)-->|
> | | (とても長い)
> | |-- end: increment の処理終了
> | |
>
> 1. 二つのクラスで間でsignal/slot通信をします。
> UI: signal void requestInc(); // increment要求
> Model: slot void increment(); // increment実処理
>
> 2. incrementは処理にとても時間がかかります(例:1分)。
>
> 3. このため、UIとModelを別スレッドで実行します。
> QueuedConnectionでsignal/slotは接続します。
>
> 4. Bの処理中もAのsignalは発行可能なので、ボタン連打などにより
> requestIncはバンバン送られます。
>
> 5. Modelが最初のincrementを処理したときには、signalが山のように
> 積みあがっいます。n個あるとすると、処理するにはn*1分かかります。
>
> 別口でUIにincrement結果を返すようななっているとすると、
> 連打した結果がn分後になってようやくUIに反映されます。
>
> (周期取得処理)
> ボタン連打同様に、1秒ごとに値取得する周期処理などを実行すると
> 1分待たされる間に60個くらいsignalがたまってしまいます。
>
> 以下のように解決方法はいくつか思いつくのですが、どれもすっきりしないのです。
>
> 解1) UI側で対処: signal発行する前に止める
> - Modelからslot処理終了を受けとるまで、
> 次の発行しない仕組みを独自に作るなど。
QObject::blockSignals(bool) で止められます。
> 解2) Model側で対処: slot側で受信後、実処理するか判断。
> - 前のsignalを実行し終わった時間から一定時間たつまで実処理しない、など。
>
> 解3) 同期にする
> - Model処理している間UIが固まります(マルチスレッド化した意味なし)
>
> 「重複したsignalのqueueがあった場合、二つ目以降は圧縮する(無視する)」
> というような設定がQtにあればと思ったのですが、見当たりませんでした。
> よく悩みがちな問題な気がするので、自力で作り始めてよいものかどうか…
>
> Qtの仕組みやその周辺でスマートに解決した例などあれば、ご教示いただければ幸いです。
>
> 以上よろしくお願いします。
>
> -----
> imudak@gmail.com
> _______________________________________________
> Qt-users mailing list
> Qt-users@qt-users.jp
> http://qt-users.jp/mailman/listinfo/qt-users
_______________________________________________
Qt-users mailing list
Qt-users@qt-users.jp
http://qt-users.jp/mailman/listinfo/qt-users