« Urg invalid response. | トップページ | センサデータログにはまだ未解決の部分が残っている »

2010年10月 9日 (土)

スレッドプールに溜まっていたことが判明

先日の日記で書いたセンサデータのログがおかしい件、ほぼ解決しました。

本来ならば一つのスレッドからしかセンサデータのログを書き込んでいないはずなのに、システムログのエラーの出始めるところをみると、複数のスレッドが同じタイミングでエラーを吐いていますね。ここがポイントでした。

理由は、ログ収集開始時にプログラムの処理が遅くなるところがあったからでした。今、マニュアル走行モードのタイマには、System.Timers.Timerを使用して、Elapsedイベントを使って 100ms 毎にセンサデータをログファイルに書き込んでいます。ここで、Elapsedイベントのイベントハンドラの処理が100msを超えてしまうと、別のThreadPoolスレッドで同じイベントが再発生することがあるそうです。

ここでプログラム中でレーザーレンジスキャナのセンサデータをログファイルに保存する部分を見てみると、約1000点のデータを保存するために毎回 scannedData = new int[lrsMaxData]; のようにメモリ領域を確保する処理が入っていることに気付きました。C言語でいうところの malloc / calloc のようにメモリ領域確保は処理時間を要する部類なので、C#でもおそらくそうなのだと思います。これのメモリ領域確保が1回で済むように書き直したところ、平均 20~40msかかっていたセンサログ書き込みが平均 5~6msにまで短くなり、先日の日記で出ていたようなエラーも発生しなくなりました。

« Urg invalid response. | トップページ | センサデータログにはまだ未解決の部分が残っている »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/49687877

この記事へのトラックバック一覧です: スレッドプールに溜まっていたことが判明:

« Urg invalid response. | トップページ | センサデータログにはまだ未解決の部分が残っている »

最近の写真