一応HSPwikiのバグトラックに書いとこうと思ったらエラーになるのでここに書き込みます。
>開発者の方へ
PCを25日弱連続で使うと質問者の問題がおきます
以下の2点を修正することで解決できると思います。
http://dev.onionsoft.net/trac/browser/trunk/hsp3/hsp3code.cppの2455行目
if ( hspctx->waittick < 0 ) {
を
if ( hspctx->waittick == -1 ) {
に変更。
同2459行目の
if ( tick >= hspctx->waittick ) {
を
if ( tick - hspctx->waittick >= 0 ) {
2点目は修正しないと滅多にないがwaitで延々と待機し続けることがあります。
以上でも問題は残りますが実用上ほぼ問題ないと思います。
wait 1 が不安定(
http://hsp.tv/play/pforum.php?mode=pastwch&num=54114)
ついでにこの問題ですが
http://dev.onionsoft.net/trac/browser/trunk/hsp3/win32gui/hsp3win.cppの193行目で
GetTickCountを使いその他でtimeGetTimeを使って混在させてるのが原因みたいです。
二つの関数の精度の違いで起こります。
以下は検証用スクリプト
入力ボックスの値がwaitのパラメータ
上のバーはループ一回の時間
下のバーはGetTickCountとtimeGetTimeの差で緑のとき+で赤のときが-。
この差の分だけ待機時間の理論値とずれが生じるはずです。
起動時のタイミングにより-10ms以上の差が出ると待機時間が0(wait 0と同等)になりCPUが100%になるみたいです。
#include "winmm.as"
#include "kernel32.as"
#include "comctl32.as"
sx=600:sy=110
screen 0,sx,sy,1 //なるべく描画の負荷の影響を減らすためにパレットモードにして更新も最小限にする
wt=1
input wt,50,25
ic=8,16
InitCommonControlsEx varptr(ic)
CreateUpDownControl 0x50800086,0,0,0,0,hwnd,0x10000,hinstance,objinfo_hwnd(0),1000,0,wt
palette 1,255,0,0,0
palette 2,0,255,0,0
palette 3,0,0,255,1
//目盛り描画
repeat sx/5
line cnt*5,sy-20,cnt*5,sy-30
if cnt\5==0:line cnt*5,sy-20,cnt*5,sy-35
if cnt\10==0:line cnt*5,sy-20,cnt*5,sy-40 : pos cnt*5-10,sy-20:mes cnt
loop
repeat
crtime=timeGetTime()
diftime=GetTickCount()-crtime
looptime=crtime-pretime
pretime=crtime
wait wt
redraw 0
color 255,255,255
boxf 0,30,sx,70
color 0,0,255
boxf 0,30,looptime*5,50
if diftime>=0:color 0,255,0:else:color 255,0,0:diftime=-diftime
boxf 0,50,diftime*5,70
redraw 1,0,30,sx,40
if crtime-pretime2>=1000{
//fps表示
redraw 0
color 255,255,255
boxf 50,0,150,25
color
pos 50,0
mes "fps="+fps
redraw 1,50,0,100,25
fps=0
pretime2=crtime
}
fps++
loop