SetTimer 问题

hhhh63 2016-09-21 09:31:59
一个简单的MFC定时程序,有时SetTimer后立即执行,有时定时后执行。
我希望都是定时后执行,怎么解决?请指点,主要代码如下:

void CALLBACK MainWnd::myTimer( // 必须要静态或全局的
HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT_PTR nIDEvent, // timer identification 指向this
DWORD dwTime // system time
)
{
((MainWnd*)nIDEvent)->autoScan();
}
int m_t1 = 0;
int m_t2 = 0;
void MainWnd::autoScan()
{
m_t2 = GetTickCount();
ASSERT( m_t2 - m_t1 > 1000 );

if( m_nTimer )
{
BOOL b = KillTimer( m_nTimer );
ASSERT( b );
m_nTimer = 0;
}

......

ASSERT( m_nTimer == 0 );
m_nTimer = SetTimer( (UINT_PTR)this, nIntervals[m_nAutoNum]*1000, myTimer );
ASSERT( m_nTimer == (UINT_PTR)this );

m_t1 = GetTickCount();

......

}
...全文
461 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2016-09-24
  • 打赏
  • 举报
回复
引用 15 楼 oyljerry 的回复:
换chrome等试试。
引用 16 楼 xuddk727 的回复:
同上,换换自带的ie等试试,我用的firefox没出现过这种问题
好,等有时间试试吧
许文君 2016-09-23
  • 打赏
  • 举报
回复
同上,换换自带的ie等试试,我用的firefox没出现过这种问题
oyljerry 2016-09-22
  • 打赏
  • 举报
回复
换chrome等试试。
hhhh63 2016-09-22
  • 打赏
  • 举报
回复
引用 1 楼 xuddk727 的回复:
你不主动调用ontimer不会立即执行啊,都是后执行的
请问版主,不能结帖,总说分数不符,我这两天算了好多遍。 Win10企业版,Edge浏览器
hhhh63 2016-09-22
  • 打赏
  • 举报
回复
请问版主,不能结帖,总说分数不符,我这两天算了好多遍。 Win10企业版,Edge浏览器
lonelyhacker 2016-09-21
  • 打赏
  • 举报
回复
void CDlgTimerDlg::autoScan() { if(m_nTimer) { KillTimer(m_nTimer); m_nTimer = 0; } m_nTimer = SetTimer((UINT)this, nIntervals[m_nAutoNum]*1000, myTimer ); } 这样应该就可以每次跑进来都能执行,执行的时间根据你的 nIntervals[m_nAutoNum]*1000决定。至少还要有个条件关闭掉Timer,再也不打开的情况。比如你不再拍照的时候,要KillTimer。不要让它一直在跑。
lonelyhacker 2016-09-21
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:

int m_t1 = 0;
int m_t2 = 0;
UINT m_nTimer=0;
// 
void CALLBACK CDlgTimerDlg::myTimer(
    HWND hWnd,      // handle of CWnd that called SetTimer
    UINT nMsg,      // WM_TIMER
    UINT nIDEvent,  // timer identification 指向this
    DWORD dwTime    // system time
    )
{
	((CDlgTimerDlg*)nIDEvent)->autoScan();
}

void CDlgTimerDlg::autoScan()
{
    m_t2 = GetTickCount();
	if(m_t1==0)
	{	
		m_t1=m_t2;
		return;
	}
    if( m_t2 - m_t1 > 1000 )
	{
		afxDump << m_t2 - m_t1 << " Set\n";// ==="1014 Set"
		if( m_nTimer )
		{
			KillTimer( m_nTimer );
			m_nTimer = 0;
		}
	}
// 
    if(m_nTimer == 0 )
	{ // nIntervals[m_nAutoNum]*
		m_nTimer = SetTimer((UINT)this, 1000, myTimer );
		ASSERT( m_nTimer == (UINT)this );
	}

    m_t1 = GetTickCount();
}
afxDump << m_t2 - m_t1 << " Set\n";// ==="1014 Set"
1.分析代码来看的话,确实是会偶尔执行SetTimer,第一次进不执行, if( m_t2 - m_t1 > 1000 )的时候才能执行SetTimer。 否则都不执行。
hhhh63 2016-09-21
  • 打赏
  • 举报
回复
引用 6 楼 syy64 的回复:
那不叫定时吧,那是时间间隔吧。
我就是想弄时间间隔,有没有更好的方法?就是一个自动照像的软件,每照一张等一下,不同的动作等的不一样长。
syy64 2016-09-21
  • 打赏
  • 举报
回复
那不叫定时吧,那是时间间隔吧。
schlafenhamster 2016-09-21
  • 打赏
  • 举报
回复
class CDlgTimerDlg : public CDialog { static void CALLBACK myTimer(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime); 。。。。 vc6
schlafenhamster 2016-09-21
  • 打赏
  • 举报
回复

int m_t1 = 0;
int m_t2 = 0;
UINT m_nTimer=0;
// 
void CALLBACK CDlgTimerDlg::myTimer(
    HWND hWnd,      // handle of CWnd that called SetTimer
    UINT nMsg,      // WM_TIMER
    UINT nIDEvent,  // timer identification 指向this
    DWORD dwTime    // system time
    )
{
	((CDlgTimerDlg*)nIDEvent)->autoScan();
}

void CDlgTimerDlg::autoScan()
{
    m_t2 = GetTickCount();
	if(m_t1==0)
	{	
		m_t1=m_t2;
		return;
	}
    if( m_t2 - m_t1 > 1000 )
	{
		afxDump << m_t2 - m_t1 << " Set\n";// ==="1014 Set"
		if( m_nTimer )
		{
			KillTimer( m_nTimer );
			m_nTimer = 0;
		}
	}
// 
    if(m_nTimer == 0 )
	{ // nIntervals[m_nAutoNum]*
		m_nTimer = SetTimer((UINT)this, 1000, myTimer );
		ASSERT( m_nTimer == (UINT)this );
	}

    m_t1 = GetTickCount();
}
afxDump << m_t2 - m_t1 << " Set\n";// ==="1014 Set"
hhhh63 2016-09-21
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
nIntervals[m_nAutoNum]*1000 这个是干什么的 ?
定时时间数组,从秒变成毫秒,每一步定不同的时间。
schlafenhamster 2016-09-21
  • 打赏
  • 举报
回复
nIntervals[m_nAutoNum]*1000 这个是干什么的 ?
许文君 2016-09-21
  • 打赏
  • 举报
回复
你不主动调用ontimer不会立即执行啊,都是后执行的
hhhh63 2016-09-21
  • 打赏
  • 举报
回复
找到问题了,别的代码调用了autoScan(),与SetTimer无关,谢谢各位,结帖。
schlafenhamster 2016-09-21
  • 打赏
  • 举报
回复
第一次进不执行 与 init 有关, m_t1 没初始化! // TODO: Add extra initialization here m_t1=m_t2=GetTickCount(); SetTimer((UINT)this, 1000, myTimer);

void CDlgTimerDlg::autoScan()
{
    m_t2 = GetTickCount();
    if( m_t2 - m_t1 > 1000 )
	{
		afxDump << m_t2 - m_t1 << " Set\n";// ==="1014 Set"
		if( m_nTimer )
		{
			KillTimer( m_nTimer );
			m_nTimer = 0;
		}
	}
// 
    if(m_nTimer == 0 )
	{ // nIntervals[m_nAutoNum]*
		m_nTimer = SetTimer((UINT)this, 1000, myTimer );
		ASSERT( m_nTimer == (UINT)this );
	}
//
    m_t1 = GetTickCount();
//	afxDump << m_t2 - m_t1 << " \n";// ===0
}
syy64 2016-09-21
  • 打赏
  • 举报
回复
可考虑利用当前时间和累积时间,产生事件触发机制。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧