2015年9月26日土曜日

A timeout occurred, the debugger will try to continue ....

Mac にて Lazarus 上でデバッグしていたんだ。
ブレークポイントで止めて、調子良くステップ実行していると、
以下のようなポップアップメッセージが表示され、
本当に邪魔だった。

「A timeout occurred, the debugger will try to continue ....」

作成しているプログラムが小さい内には、表示される回数も少ないようなんだけど、
プログラムが大きくなってくると、このメッセージが表示される回数も増えるみたい。
仕舞にはステップ毎に表示されるようになってしまった。
本当にウザいわ。

解決方法をググッてみても、それっぽい記事は見つからなかった。
結局、オプションからメッセージをOFFにすることにしたのだけど、
まあ、良いのかな?

また、快適なステップ実行ライフができるようになったし。

設定したのは、IDE から
「ツール」−「オプション」を選択。

2015年9月19日土曜日

Hash コンテナは、メモリ喰いなのね、、

最近作成したアプリで、過度にメモリを消費する状況があったんだ。
データをコンテナ管理するクラスを多数(100個位)生成していたのだけど、
レコード数は0件でも、クラスを生成するだけで、メモリが100MByte近く消費される状況だった。
最初はレコードを構成するのに、取り敢えずどのような型でも突っ込めるVariantクラスでレコード型定義しているのが、原因なのかな?と考えていたのだけど、小さなプログラムでVariantで表現したレコードクラスとStringで表現したレコードクラスを比較しても100MByteを消費する程、差は生じなかった。
そこで、自作のデータコンテナクラス内にて持っていた色々な従属情報を、使用されるタイミンで都度 Create するように順次修正しながら、メモリの使用状況を確認していったんだ。
そしたら、ある従属情報で急にメモリの使用量が減った。
その従属情報は、継承元に FPC ライブラリの contnrs.TFPObjectHashTable を使用していたのだけど、試しに TStringList で代用したクラスで再実装してみたところ、その従属情報を Create してもメモリ喰いは起きなくなった。
あれ? TFPHashXXXX 系って、データ突っ込まなくても、クラス生成だけでメモリ喰いするのかな?
と、思いながらも他にも使用していた TFPHashXXXX を取り敢えず、代替簡易クラスを作成して置換えていったら、使用メモリが激減するようになった。

作成したアプリで使用していた TFPHashXXXX 系は、以下だった。

contnrs
-----------------------------
TFPHashList
TFPStringHashTable
TFPObjectHashTable


結局今回は、文字列キーからの参照速度はさておき TStringList.Objects プロパティで、置換え可能な箇所は修正することにした。
TFPHashXXXX 系は、使用されるメモリ量が増える事を把握した上で、文字列キーで検索速度を優先したい場合に使用するようにする、と言うことなのかな。