定时器的使用,该如何解决
定时器的使用
在一个对话框(CAllDeviceStatus)中用到定时器
开始是在构造函数中启动定时器
CAllDeviceStatus::CAllDeviceStatus(CWnd* pParent /*=NULL*/)
: CDialog(CAllDeviceStatus::IDD, pParent)
{
//{{AFX_DATA_INIT(CAllDeviceStatus)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_UpdateTimerID=SetTimer(1,2000,UpdateStatus);//
}
在另外一个地方调用显示该对话框
CAllDeviceStatus DeviceStatusDlg;
DeviceStatusDlg.DoModal();
每次在弹出窗体前都出现Debug Assert Failed!页面,要求终止程序。
后来改在OnInitDialog中启动定时器就正常了
BOOL CAllDeviceStatus::OnInitDialog()
{
m_UpdateTimerID=SetTimer(1,2000,UpdateStatus);//
}
不知道是什么原因??
------解决方案--------------------
_AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse,
void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD))
{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
lpfnTimer); }
上面是SetTimer的代码,由此可见Timer是和一个窗口捆定在一起的,在Constructor中类还没有构造完成,更别提窗口了,ASSERT(::IsWindow(m_hWnd)); 这个地方会退出程序。
而在OnInitDialog中窗口已经建立完毕,因此没有问题。
------解决方案--------------------
构造函数执行的时候,窗体还没创建,定时器自然就绑不上去了
在一个对话框(CAllDeviceStatus)中用到定时器
开始是在构造函数中启动定时器
CAllDeviceStatus::CAllDeviceStatus(CWnd* pParent /*=NULL*/)
: CDialog(CAllDeviceStatus::IDD, pParent)
{
//{{AFX_DATA_INIT(CAllDeviceStatus)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_UpdateTimerID=SetTimer(1,2000,UpdateStatus);//
}
在另外一个地方调用显示该对话框
CAllDeviceStatus DeviceStatusDlg;
DeviceStatusDlg.DoModal();
每次在弹出窗体前都出现Debug Assert Failed!页面,要求终止程序。
后来改在OnInitDialog中启动定时器就正常了
BOOL CAllDeviceStatus::OnInitDialog()
{
m_UpdateTimerID=SetTimer(1,2000,UpdateStatus);//
}
不知道是什么原因??
------解决方案--------------------
_AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse,
void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD))
{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
lpfnTimer); }
上面是SetTimer的代码,由此可见Timer是和一个窗口捆定在一起的,在Constructor中类还没有构造完成,更别提窗口了,ASSERT(::IsWindow(m_hWnd)); 这个地方会退出程序。
而在OnInitDialog中窗口已经建立完毕,因此没有问题。
------解决方案--------------------
构造函数执行的时候,窗体还没创建,定时器自然就绑不上去了