Я пытаюсь использовать mmTimer с функцией обратного вызова, которая является статической функцией CALLBACK
. Я знаю, что статическая функция не может вызывать нестатическую функцию, благодаря вам все ребята, кроме случаев, когда статическая функция получает указатель на объект в качестве аргумента. Странно, что мой таймер отлично работает в режиме деблокирования, и когда я пытаюсь запустить его в режиме отладки, появляется это незаслуженное исключение, которое всплывает и прерывает программу.Мультимедийный таймер работает нормально в режиме деблокирования, но не в режиме отладки
void CMMTimerDlg::TimerProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CMMTimerDlg* p = (CMMTimerDlg*)dwUser;
if(p)
{
p->m_MMTimer += p->m_TimeDelay;
p->UpdateData(FALSE);
}
}
мои вопросы: - есть ли способ решить эту проблему? - Если эта ошибка возникает в режиме отладки, кто гарантирует, что это не произойдет, когда я выпущу программу?
там, где программа останавливается:
#ifdef _DEBUG
void CWnd::AssertValid() const
{
if (m_hWnd == NULL)
return; // null (unattached) windows are valid
// check for special wnd??? values
ASSERT(HWND_TOP == NULL); // same as desktop
if (m_hWnd == HWND_BOTTOM)
ASSERT(this == &CWnd::wndBottom);
else if (m_hWnd == HWND_TOPMOST)
ASSERT(this == &CWnd::wndTopMost);
else if (m_hWnd == HWND_NOTOPMOST)
ASSERT(this == &CWnd::wndNoTopMost);
else
{
// should be a normal window
ASSERT(::IsWindow(m_hWnd));
// should also be in the permanent or temporary handle map
CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);
, когда он попадает в PMAP он останавливается на этом утверждении !!!!
здесь статическая функция CALLBACK
static void CALLBACK TimerProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
вот как установить таймер
UINT unTimerID = timeSetEvent(m_TimeDelay,1,(LPTIMECALLBACK)TimerProc,(DWORD)this,TIME_PERIODIC);
Как установить таймер вверх? Что такое стек вызовов в позиции исключения? –
@Roman R UINT unTimerID = timeSetEvent (m_TimeDelay, 1, (LPTIMECALLBACK) TimerProc, (DWORD) это, TIME_PERIODIC); – user2390922
Вы на 32-битной платформе? DWORD нельзя использовать указатель s на 64-битном. не –