关于MFC定时器的一点问题

时间:2021-09-20 00:23:14
我设置了两个定时器都是用的OnTimer定义的,在一个对话框中定义如下:

void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Detect();
CDialog::OnTimer(nIDEvent);
}

void CDlgSDH::StartDetect()
{
//m_TimeID = ::timeSetEvent (1000,1,CallBackFunc,(DWORD)this,TIME\_PERIODIC); 
SetTimer(1,1000,NULL);
}

void CDlgSDH::StopDetect()
{
//::timeKillEvent(m_TimeID);
KillTimer(1);
}

在另一个对话框中定义如下:

void CDlgPDHAps::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (3 == nIDEvent)
{
UpdateItem();

if (2 == nIDEvent)
{
UpdateSepTip();
}

CDialog::OnTimer(nIDEvent);
}

void CDlgPDHAps::UpdateResult()
{
SetTimer(2,200,NULL);

SetTimer(3,300,NULL);
}

两个对话框的SetTimer都放在了OnInitDialog()函数执行,可是当我程序运行的时候前面一个定时器执行的时候后面的一个就不执行了,请问这是什么回事,有人遇到过吗?还有是不是OnTimer这个定时器有问题?大家分享一下咯!

7 个解决方案

#1


前面一个对话框的定时器是1秒执行一次,后面的对话框的两个定时器分别是200ms和300ms执行一次,可是当我的程序运行的时候,前面的一个对话框的那个定时器里的Detect()函数的一个循环一直执行的话,后面一个对话框的两个定时器2、3就都不执行,这是怎么回事?再说了,我前面的那个对话框的循环也sleep(50)了!

#2


timer是和窗口相关联的
2个dialog用2个timer

#3


引用 2 楼 ouyh12345 的回复:
timer是和窗口相关联的
2个dialog用2个timer

我就是这样子用的,就是两个对话框分别用来一个OnTimer()的,可是当我上面所说的前一个对话框的OnTimer()里的一个循环一直执行的话,后面一个对话框的OnTimer()就不执行了,后来我让前面一个对话框的OnTimer()里面的循环sleep(50)可是也不行!

#4


试试看,不保证对:
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    Detect();
    CDialog::OnTimer(nIDEvent);
}

void CDlgSDH::StartDetect()
{
    //m_TimeID = ::timeSetEvent (1000,1,CallBackFunc,(DWORD)this,TIME\_PERIODIC);
    t1=SetTimer(1,1000,NULL);
}

void CDlgSDH::StopDetect()
{
    //::timeKillEvent(m_TimeID);
    KillTimer(1);
}

在另一个对话框中定义如下:

void CDlgPDHAps::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
    if (3 == nIDEvent)
    {
        KillTimer(t3);
        UpdateItem();
        t3=SetTimer(3,300,NULL);
    }
    if (2 == nIDEvent)
    {
        KillTimer(t2);
        UpdateSepTip();
        t2=SetTimer(2,200,NULL);
    }
}

CDialog::OnTimer(nIDEvent)
{
    KillTimer(t1);
    t1=SetTimer(1,1000,NULL);
}

void CDlgPDHAps::UpdateResult()
{
    t2=SetTimer(2,200,NULL);
    t3=SetTimer(3,300,NULL);
}


#5


引用 4 楼 zhao4zhong1 的回复:
试试看,不保证对:

C/C++ code
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    Detect();
    CDialog::OnTimer(nIDEvent)……


CDialog::OnTimer(nIDEvent)
{
    KillTimer(t1);
    t1=SetTimer(1,1000,NULL);
}
是什么意思呢?

#6


引用 5 楼 lclwjl 的回复:
引用 4 楼 zhao4zhong1 的回复:
试试看,不保证对:

C/C++ code
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Detect();
CDialog::OnTi……

意思大概就是SetTimer一次只保证下次OnTimer响应。如果想循环就要在OnTimer里面再次KillTimer+SetTimer

#7


hao

#1


前面一个对话框的定时器是1秒执行一次,后面的对话框的两个定时器分别是200ms和300ms执行一次,可是当我的程序运行的时候,前面的一个对话框的那个定时器里的Detect()函数的一个循环一直执行的话,后面一个对话框的两个定时器2、3就都不执行,这是怎么回事?再说了,我前面的那个对话框的循环也sleep(50)了!

#2


timer是和窗口相关联的
2个dialog用2个timer

#3


引用 2 楼 ouyh12345 的回复:
timer是和窗口相关联的
2个dialog用2个timer

我就是这样子用的,就是两个对话框分别用来一个OnTimer()的,可是当我上面所说的前一个对话框的OnTimer()里的一个循环一直执行的话,后面一个对话框的OnTimer()就不执行了,后来我让前面一个对话框的OnTimer()里面的循环sleep(50)可是也不行!

#4


试试看,不保证对:
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    Detect();
    CDialog::OnTimer(nIDEvent);
}

void CDlgSDH::StartDetect()
{
    //m_TimeID = ::timeSetEvent (1000,1,CallBackFunc,(DWORD)this,TIME\_PERIODIC);
    t1=SetTimer(1,1000,NULL);
}

void CDlgSDH::StopDetect()
{
    //::timeKillEvent(m_TimeID);
    KillTimer(1);
}

在另一个对话框中定义如下:

void CDlgPDHAps::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
    if (3 == nIDEvent)
    {
        KillTimer(t3);
        UpdateItem();
        t3=SetTimer(3,300,NULL);
    }
    if (2 == nIDEvent)
    {
        KillTimer(t2);
        UpdateSepTip();
        t2=SetTimer(2,200,NULL);
    }
}

CDialog::OnTimer(nIDEvent)
{
    KillTimer(t1);
    t1=SetTimer(1,1000,NULL);
}

void CDlgPDHAps::UpdateResult()
{
    t2=SetTimer(2,200,NULL);
    t3=SetTimer(3,300,NULL);
}


#5


引用 4 楼 zhao4zhong1 的回复:
试试看,不保证对:

C/C++ code
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    Detect();
    CDialog::OnTimer(nIDEvent)……


CDialog::OnTimer(nIDEvent)
{
    KillTimer(t1);
    t1=SetTimer(1,1000,NULL);
}
是什么意思呢?

#6


引用 5 楼 lclwjl 的回复:
引用 4 楼 zhao4zhong1 的回复:
试试看,不保证对:

C/C++ code
UINT t1,t2,t3;
void CDlgSDH::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Detect();
CDialog::OnTi……

意思大概就是SetTimer一次只保证下次OnTimer响应。如果想循环就要在OnTimer里面再次KillTimer+SetTimer

#7


hao