マルチメディアタイマー
2000年11月30日
OnTimer() じゃなくてマルチメディアタイマーとやらを使うようにしてみた.
これでたぶん 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 のユーザリソース食いつぶし現象はどうなったんだっけ…?