timeGetTimeに騙された

さて、私が最近作ったプログラム(文プロとか。FPS制御してるやつ)に重大なバグが見つかりました。
それは・・・「2147483647 秒以上起動したWindows上で実行しようとすると止まる」

・・・原因あからさまですねー。しかし一応書いておいて自分自身への訓告としよう。

まず、私はfps計算の際にtimeGetTimeを使用していたわけです。この関数はWindowsが起動してからの時間をミリ秒で返してくれるというものでなかなかの優れものなのですが、これをlong型で受け取っていたのです。
いや、そこまでならまだいいのですが、long型に代入しつつ0との差をとってそれがある一定以上の数(正の整数)になったら処理するようにしていたのです。
さて、それで2147483647秒以上経過したWindows上でtimeGetTimeによって返される値は当然2147483647を大きく超えたものになりますが、これを当環境においては32ビット符号付変数のlongに代入すればもちろん負の数になります。そして負の数から0を引いてもやっぱり負の数になり永遠に処理が実行されなかったのでしたー!ちゃんちゃん。


とりあえず教訓。

1.timeGetTimeの返り値は符号無しで受け取ろう(時間が負ってのは謎)
2.timeGetTimeの返り値は他のtimeGetTimeの返り値との差をとることでのみ利用しよう。そうすれば負だの正だのといった問題は無くなる。(てかMSDNにそう書いてあったし)

FPS制御の際のポイントでしたーって誰もやんねーよこんなこと。
しかし長時間起動してると発現する時限バグってのも厄介なものですね。バグ無しプログラムなんてものはこの世に存在しないってのはきっと真実でしょう。