2008-09-15

WhereNow更新

WhereNowのバグ修正をしました。
 
コメントでご指摘頂いて初めて気がついたのですが、メニューから一度ログのクリアを実行するまでログが作られていいませんでした。
原因は CreateFile()にOPEN_ALWAYSを渡すべきところを OPEN_EXISTINGにしていたために、新規にファイルを作成することができないという情けないものでした。
ログのクリアはファイルの作成を兼ねているので、一度でもクリアを実行すると無事にログを作成できていたんですね。失礼いたしました。
 
つまらないバグついでにコードを見直しているとこんなのも見つけました。
static VOID ExecGoogleMap()
{
    PROCESS_INFORMATION pi              = {0};
    TCHAR               szParam[256]    = _T("");

    if (0 < g_dblLatitude && 0 < g_dblLongitude) {
        // パラメータ作成
    }
    if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
        CloseHandle(pi.hProcess);
    }
}

モバイルGoogleマップを起動している部分ですが、適当にサンプルを写したので 意味もなくPROCESS_INFORMATIONを使っています。
この場合、モバイルGoogleマップの終了を待っている訳でもないので piがメモリリークしちゃうんですよね。多分... (勘違いだったらこっそり教えて下さい)
勘違いでした(笑
pi.hProcessをCloseHandle()しているのが悪いのではなく、pi.hThreadをCloseHandle()していない事が悪かったみたいです。
static VOID ExecGoogleMap()
{
    PROCESS_INFORMATION pi              = {0};
    TCHAR               szParam[256]    = _T("");

    if (0 < g_dblLatitude && 0 < g_dblLongitude) {
        // パラメータ作成
    }
    if (CreateProcess(g_szGoogleMapPath, szParam, NULL, NULL, NULL, 0, NULL, NULL, NULL, &pi)) {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
}

 
また、GPSの監視部分でもサンプルを写したときの間違いがありました。
お手本にした「Windows Mobileプログラミング徹底理解」では3種類のイベントを監視していたのですが、WhereNowでは2種類を監視すればよかったので 次のようにしています。
static  HANDLE  g_hGpsEvent[2] = {0};

// GPS計測開始
VOID GpsStart(HWND hWnd)
{
    g_hGpsEvent[EVENT_STOP]         = CreateEvent(NULL, FALSE, FALSE, NULL);
    g_hGpsEvent[EVENT_NEWLOCATION]  = CreateEvent(NULL, FALSE, FALSE, NULL);

ところが、肝心のイベント監視の部分ではそのまま WaitForMultipleObjects(3, ...)としていました。
今度は典型的なバッファオーバーランですね。WaitForMultipleObjects(2,...)と修正しておきました。
 
探せば他にもボロが出てきそうですが、今日はこの辺で...。
 

10 件のコメント:

ori さんのコメント...

pi.hProcessとpi.hThreadの両方をCloseHandle()してもリークします?

私が書いているコードでも,意味もなくPROCESS_INFORMATIONを使っていたりします...

kazuaki さんのコメント...

oriさん こんばんは。
早速のご指摘ありがとうございます。(いまいち自信が無かったので...)

やはり私の勘違いのようでした。
pi.hProcessをCloseHandle()しているのが悪いのではなく、pi.hThreadをCloseHandle()していない事が悪かったみたいです。

ふと思い立って /analyzeしてみるとズバリ「pi.hThreadがリークしている」と言われてしまいました。
勉強になりました。

kata さんのコメント...

今日から使わせていただいています。
当方X04HTでの使用なのでGPS限定ですが、やはり2行表示になってしまうのが非常に惜しいです。
なんとかGPSで1行表示を実装してもらえないでしょうか。
あとGPSで使用していると短時間で何回も更新がかかるときがあり、他のアプリ、特に音楽を聴いていると音飛びが発生してしまいます。
おそらく住所データの検索が重いのではないかと思いますが、何か対策してもらえると助かります。

kazuaki さんのコメント...

kataさん こんばんは。
コメントありがとうございます。

そういえばGPS使用のときは2行表示のままでしたね。

GPSユニットは常に持ち歩いているのですが、いちいち電源を入れるのが面倒であまり使っていませんでした。
やはりGPS内蔵の方がいいですね。

1行表示は問題ないのですが 検索が重いのは住所データを検索にいく頻度を下げるくらいしかないでしょうか?
私も音楽でも聞きながら持ち歩いて調整してみます。

nmaeda さんのコメント...

常に全国の住所データが必要な方は少ないと思うので、地域別に分割すると多少は検索が軽くならないものでしょうか? データが小さければ、本体メモリに収めても良い気がしますし。

収納場所が変わらない場合、ハッシュか何かでインデックスを作られていれば大差ない速度かも知れませんが。

kata さんのコメント...

こんばんは、kataです。
検索の重さを回避するには、検索ロジック自体を見直すしかないとは思いますが、てっとり早く対応するならnmaedaさんが仰るようにデータを地域別に分割するのが楽なような気がします。
これは現状、検索の度に毎回全データを参照しているならばの話ですが(ソース見てないので憶測です)。
あとは検索頻度を下げる方法ですね。
これまたソースを見てないので既にやってるかもしれないですが、数メートル程度の移動ならGPSの誤差に入りそうなので、その程度の移動距離なら無視するとかですかね。

ついでに要望があります。
ひとつはログのON/OFFを選べるようにして欲しいです。
あとはGPSが受信できない場所で前回の場所が表示され続けるのをやめてもらいたいです。
それと前回書いたGPS時の1行表示。
ついでに欲を言えばUSIM対応。
GPS+USIMなんてできたら最高(GPSが受信できないときはUSIMから基地局データを表示するとか)。

注文が多くて申し訳ないです。
お暇なときに気が向いたら対応していただければうれしいです。

kazuaki さんのコメント...

nmaedaさん kataさん こんばんは。
お返事が遅くなり申し訳ありません。

住所データはインデックスのようなものを作っているのとある程度小さい単位で分割しているので1回あたりの読み込みはそれほど負荷にならないのかなと思っています。
やはり連続して読み込みが発生するのが問題なのでしょうね。まだまだ調整が必要な部分だと思います。

kataさんのご要望については手が空いたら対応を考えるようにします。(USIMは無理ですが)
...とか書いておきながら放置している問題がいっぱいあるので長い目で見守ってやってください(笑

ところで USIMでも何らかの方法で現在位置が取得できるんでしょうか?
そういえば、携帯のGoogleマップでも場所が取れているのでちょっと気になります。

ちょうど明日はドコモからTG01が発表されますね。
WM6.5にアップグレード可能でお気軽な料金プランがあるなら手に入れたいのですが...

匿名 さんのコメント...

住所データをマイクロSDにダウンロードして解凍したのですが、
TODAYの設定で住所データを指定するやり方がわかりません。

SDカードに解凍しているのに住所データファイルを指定してやろうとしてもなにも表示されません。
お願いします。。。。

kazuaki さんのコメント...

こんばんは。
返信が遅くなってしまってすみません。

住所データの場所指定がフォルダ選択ダイアログになってないので紛らわしいですね。
(単なる手抜きです...重ねてすみません)

「住所データの保存場所」欄横の「...」ボタンでファイル選択ダイアログを表示して、解凍したwnフォルダの中の任意のファイル(address1.datあたりでいいです)を選択してください。
選択後、テキストボックスが「\microSDカード\wn」のようになっていれば大丈夫だと思います。

HW3ユーザー さんのコメント...

はじめてこちらのソフトを知ってHybrid W-ZEROで使用しています。

問題なく使えているのですが、他の方が以前に要望されたGPS使用時の一行表示への対応をお願いします。

それと質問なのですが、これはGPS測定を使うと言うことでバッテリーの消費も随分と進んでしまうのでしょうか?
それともロガーとはことなり、負担は軽いのでしょうか?