バグ:所有カードビューを開き続けると異常停止
Build: 2020-06-27 15:29:35 Debug (64-bit)
Compiled by Digital Mars D 2092
普通のシナリオでは問題にならない様ですが
ある程度大きいシナリオでキャストの所有カードビューを
開き続けると異常停止が確実に再現します。
大型シナで試してみたところ、冒険者の宿では20キャストぐらい同時に開くと
ルーンディアやリムリック等だと30キャスト分を越えたあたりで落ちます。
同じシナリオは(若干の誤差はありつつ)開いているビューの合計数が大体同じある数を超えると落ちるようです。
シナリオ読み込み直後の操作でも落ちますのでメモリはさほど使用していない状態です。
初期設定で、32bit版でも同様です。
Comments (7)
-
repo owner -
reporter - changed status to resolved
確認しました。大幅に緩和されたようなので実用上の問題は殆ど無いと思います。ありがとうございます。
-
repo owner いきなり落ちるよりはマシなので、ハンドルが増えすぎた時に警告が出るようにしました。
音声再生時の問題のような普通の操作でハンドルが異常に増えすぎる不具合もこれで検知できるかもしれません。
-
reporter 警告確認しました。これは助かります。ありがとうございます。
-
reporter ウインドウやタブの数を増やさなくとも警告が出るケースとしては、既にイベントビューやパッケージのタブが開いている状態で、大量のカードやテーブルビューのIDやパスを操作したりその行為のヒストリーを前後したりした場合があります。
しかしイベントビュータブが開いてない状態で同様のID大量操作を行っても一切ハンドル数は増加しませんし、エリアビューや所有カードタブだとほぼ影響が無い増加数で当然警告も出ませんが、イベントビューやパッケージを一つ開いているだけでハンドル使用数は跳ね上がり警告がでます。ID操作終了後にハンドル値は元の数に回復しますが、新規作成直後のツリーが空なパッケージのタブ表示のみであってもそうなるので何か不自然な感じがします。
ハンドルの仕組みがわからないので的外れかもしれませんが、これはそういうものなのでしょうか?
-
repo owner - エリア等の使用箇所にIDを表示するため、IDが変更されたらイベントツリービューの表示を更新する必要がある。
- イベントツリービューの更新後、再描画処理を遅延実行する。毎回イベントコンテントの表示位置等を再計算せず、後でまとめて実行するため。
- 遅延実行のために同期オブジェクトを作成する必要があり、それがセマフォハンドルを消費する。
調べてみたところ、上記のような感じでした。
ハンドル数を節約するようにしたので、一時的な増加量は開いているイベントビューの数くらいになるはずです。
-
reporter ハンドル数上昇がとても抑制され警告もでなくなりました。
ありがとうございます。
- Log in to comment
pull request #84
ご報告ありがとうございます。
ドラッグ&ドロップを受け付けるウィジェットはWindowsハンドルを消費するらしく、カードビューは開くたびにcwxeditorが使うハンドル数を増やします。それが増えすぎる事でハンドルを確保できないエラーになり、ハンドルが確保のでエラーダイアログを開く事もできず、そのまま落ちます。
緩和する事はできましたが、巨大なシナリオで大量の所有カードビューを開くと依然として同じ問題が発生します。開けるパネルの数に制限を設けるべきかもしれませんが、設けたからといって確実に防げるようになる問題でもありません。