2008年07月25日

SetTimer関数のあいたたな仕様と対応

今回も前記事同様消化の際のプロセスで得たことだが
結果的に有効なものではなくメモ書き程度だと思う。

メインスレッド集中型アプリケーション用として
タイムアウト処理にはSetTimer関数も使えるかもしれないと思ったのだが
WM_MENUSELECT等を切っているのに
タイマー動作中にメニュー操作をするなどしていると不正終了することがあった。
これは本来TimerProcにするはずのlparamを値として活用したことが原因だったらしい。
どうもメニュー操作とかダイアログが出ている間はPeekmessageを経ずに処理されるようだ。
それでどうした!......
ラベル:SetTimer
posted by Xo_ox at 22:35| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月24日

タイマーとスレッドこぼれネタなど

FPS計算とか実装方法とかがまだきっちり決まらないので
ここ数日で書いたもののボツにしていたり取りこぼしていたネタをいくつか記述した。
それでどうした!......
posted by Xo_ox at 23:00| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月22日

スレッドとタイマーとイベント その2 完了ルーチン専用スレッドを作る。

別スレッドで待つ場合完了ルーチンはWaitForSingleObjectExで待つのがいいのかと思ったが
QueueUserAPCを外部から送ればよいことに気がついた。
ここまででやったスレッドの生成と開放についてちょっとまとめてみた。
それでどうした!......
ラベル:CreateThread APC
posted by Xo_ox at 00:48| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月21日

スレッドとタイマーとイベント その1 別スレッドからメインスレッドのAPCキューにポストする。

複数スレッドを同期させるのにイベントとAPCキューがあることが分かった。
前回SetWaitableTimerをメインスレッドで呼び出しメッセージループの隙間で実行することが出来た。
いわばWM_TIMERの高精度版ともいえる。
イベントの待機待ちではなくてキューを拾うわけだから途中に動作が入ってもよいわけだ。
ということは別スレッドから完了ルーチンをメインスレッドにポストして実行させることもできるはずだと考えた。
それでどうした!......
posted by Xo_ox at 21:07| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月20日

時間計測とタイマー その7 シングルスレッドでのWaitableTimerとイベントのみでの使用

SetWaitableTimerを利用するに当たってTimeSetEventで別スレッドを起こして実行したが
「待機」が連続していなくてもいいならばメインスレッドでも使用可能である事に気がついた。
現在メッセージポンプに50msのsleepで命令を入れているがそれをsleepexにすることでうまく動作した。

そもそもSetWaitableTimerが発行スレッドのAPCキューにポストするというのが使いにくい要因ではあるが
メインルーチンに垂直同期やSleep等での時間調整があるわけだから
そのloopを利用すればメインスレッドだけですむわけだ。
また逆に完了ルーチンを指定せずメインスレッドで命令を発行して
別スレッドでシグナルで待つというアプローチも試みた。
それでどうした!......
posted by Xo_ox at 23:47| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月16日

時間計測とタイマー その6 タイマー実行中の再呼び出し

SetWaitableTimerなりtimeSetEventなりでタイマーを使う上で気になるのが処理落ち時の挙動だが
タイマールーチンにsleepをいれてどうなるか調べてみた。
今回はコールバックルーチンに間隔以上のsleepをいれてみた。
結果としてSetWaitableTimerもtimeSetEventもコールバックでsleep等で長時間ブロックすると
次のコールバックは実行されないで遅延した。
それでどうした!......
posted by Xo_ox at 23:51| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月14日

時間計測とタイマー その5 結構使いにくいWaitableTimer

本命視していたWaitableTimerの実験をしてみた。案外と使いにくい。
それでもWindows98SEでもちゃんと動作した。
MSDNでは「Win98サポートせず」となっておりWebでも資料は少ない事に納得がいった。
ようするにテストされていない。使われていない関数なのだ。
スレッドを複数組んだ場合には使っても良いだろうが
timeSetEventとtimegettimeの組み合わせが良いという結論に至った。
機器制御などにはよいと思う。※呼び出し間隔がmsオーダーなのでだめだとわかった。

今回はWindowのフリーズ回避にtimeSetEventのコールバックによるスレッド生成を利用した。
それでどうした!......
posted by Xo_ox at 21:00| Comment(1) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月13日

Win98 -i815テスト環境を復活させる。

そろそろ憶測と調査だけでは限度があるので休眠させていたP3機を復活させた。
電源以外はファンレスなので文章書きとかそちらの方が静かでいいくらいだし
Win-unix系のOSをインストールしたいところだがとりあえず小サイズのHDDがいくつかあるので
おいおいやりたい。
さし当たって現状のテストプログラムを走らせたところ結構微妙だった。
それでどうした!......
ラベル:Windows98 Apache
posted by Xo_ox at 22:31| Comment(0) | インフォメーション | このブログの読者になる | 更新情報をチェックする

2008年07月10日

時間計測とタイマー その4 マルチメディタイマーを使う

MMsystemのtimeSetEventを使ったタイマーを使ってみた。
MIDI等MCIに使われているとされるタイマーで分解能は1ms
WinNT系ではかなり安定しているらしい。
改めて試したところ
メッセージボックスなどでブロックしている最中でも実行した。
コールバックは別スレッドになるようだ。
このタイマーのもう一つのメリットは1ショットで使う場合はタイマーの削除が不要な事だといえる。
それでどうした!......
ラベル:timeSetEvent
posted by Xo_ox at 15:00| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月09日

時間計測とタイマー その3 GetTickCountとTimegetTimeの精度の確認

前回sleepが1msの精度があることが確認できたので
GetTickCountとTimegetTimeとの組み合わせでどうなるか確認した。
確認したのはWindows2000上でWIndowsXp,VISTAも同様であると思われる。

Windows98ではどちらも1msの精度があるとされるが現時点では未確認
それでどうした!......
posted by Xo_ox at 19:41| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月07日

時間計測とタイマー その2 RDTSCで負荷を測定する。

RDTSCはクロック測定命令で
少なくとも命令に消費したクロック数を知ることができる関数であり
一見最高精度の時計関数が作れそうだが
ノートパソコンの可変周波数やAthlon64等のDualコアなどでは値がずれるため
RDTSCとほぼそれをベースに実装されているQueryPerformanceCounterを使ったアプリは
うまく動かないという話をじばしばみかける。

但しPentium3や4などちょっと前のCPUにおいてはほぼ間違いなく動く関数なので
あくまで開発者が実験的時間測定に使う関数という位置付けでは無いかと思う。
とりあえず今回はシングルCPUで間違いなく動くPentium4 1.8GHz、Windows2000というカタイ環境でのみのテスト
グダグダ憶測で最適化するよりこれを使ったほうが良いと思う。

それでどうした!......
ラベル:RDTSC
posted by Xo_ox at 16:59| Comment(1) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月03日

時間計測とタイマー その1 SetTimerを使う。

SetTimerとWM_TIMERからの処理は初心者用の割り込みのような扱いがもっぱらで
マルチメディアタイマーやWaitableTimerの方が高度の扱いをされているように見られる。
しかし、演奏などの連続割り込みには向かないが負荷が低いSetTimerは
大雑把なトリガーやタイムアウト処理、そして遅延実行に向いているのではないかと思われた。
今回の使い方はGetMessage、PeekMessage後の直接処理が前提で
DispatchMessageを使っているアプリでは使えない。
※lparamに値を入れる方法はTimerProcとみなされてOS側が勝手に処理することがあることが分かりNGそれでどうした!......
ラベル:WM_TIMER SetTimer
posted by Xo_ox at 21:00| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする

2008年07月01日

微妙なデバイス接続・切断検出

ゲーム..というかDirect Input等では入力するたびに
まずデバイスが生きているか確認するのだが意外とその部分の負荷が大きかったりする。
かといって対応アプリでチェック無しでいきなりはずすとフリーズする。
デバイス接続・切断検出が出来ていればそれは不必要になる。
ということで現時点であまり脱線しない範囲でもあるデバイス検出を行うことにした。
最新のDirectInputでのテストとか肝心なことはしていない上、結構微妙な結果となった。
それでどうした!......
posted by Xo_ox at 20:06| Comment(0) | Win出直し | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。