2000/11/30(木): マルチメディアタイマー
OnTimer() じゃなくてマルチメディアタイマーとやらを使うようにしてみた.
これでたぶん Win9X でも 18fps の壁を越えれるはず.
でも,メンバ関数をコールバック関数にするためには,
static関数にしなくてはならない.
すると static でないメンバ変数にアクセスできなくなるので,
上のようにユーザがコールバック関数に渡せる引数
dwUserに自分自身のポインタ(CWinTabView*)を渡すのだが,
このコールバック関数の中(コールバック関数から呼ばれる関数も含む)で
UpdateAllViews() とかすると CDocument の ASSERT_VALID(pView) に引っかかる.
Invalidate() でメッセージを介して画面更新するとアサートしないので,
ところで Win9X のユーザリソース食いつぶし現象はどうなったんだっけ…?
これでたぶん Win9X でも 18fps の壁を越えれるはず.
でも,メンバ関数をコールバック関数にするためには,
static void CALLBACK TimeProc( UINT uTimerID, UINT uMsg,と
DWORD dwUser, DWORD dwParam1, DWORD dwParam2 );
呼び出す方は,
m_TimerID = timeSetEvent(m_TimerDelay, m_TimerResolution, &TimeProc,
(DWORD)this, TIME_PERIODIC);
static関数にしなくてはならない.
すると static でないメンバ変数にアクセスできなくなるので,
上のようにユーザがコールバック関数に渡せる引数
dwUserに自分自身のポインタ(CWinTabView*)を渡すのだが,
このコールバック関数の中(コールバック関数から呼ばれる関数も含む)で
UpdateAllViews() とかすると CDocument の ASSERT_VALID(pView) に引っかかる.
Invalidate() でメッセージを介して画面更新するとアサートしないので,
View->SendMessage(WM_USER_PUSHING, nFlags,(LPARAM)&point);というようにユーザメッセージを送るようにした.
ところで Win9X のユーザリソース食いつぶし現象はどうなったんだっけ…?