Timer DLL
场景:DLL 中怎么使用Timer
DLL 中如何使用Timer
我想在dll中定时实现一个操作如何实现?(想用Timer 我的dll中没有窗体,也不想用窗体 ) 还请各位大侠指点,尽量详细些,感谢!。
------解决方案--------------------
不想用窗体啊..
那不一定非得用定时器啊
比如说你可以用一个线程来代替,然后sleep一定时间就可以了
------解决方案--------------------
需要为DLL创建一个线程,内部有一个消息循环.
其他的和普通的窗口定时器一样.
当然,也可以有调用者创建这个线程或使用调用者已存在的线程和消息循环.
通过响应WM_TIMER消息,调用你的响应函数.
------解决方案--------------------
雪影老大正解.
你可以在调用者的WM_TIMER里面调用你DLL里的函数嘛
------解决方案--------------------
自己开一个线程,然后利用消息循环,或者自己计算...GetTickCount
------解决方案--------------------
ls
或者假如你的timer响应不需要外部数据
你就这可直接调用
UINT_PTR SetTimer( HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
定义一个static的lpTimerFunc就可以了
------解决方案--------------------
SetTimer()可以
------解决方案--------------------
使用内核定时器多好,连消息循环都不用建的。
供参考:
DLL 中如何使用Timer
我想在dll中定时实现一个操作如何实现?(想用Timer 我的dll中没有窗体,也不想用窗体 ) 还请各位大侠指点,尽量详细些,感谢!。
------解决方案--------------------
不想用窗体啊..
那不一定非得用定时器啊
比如说你可以用一个线程来代替,然后sleep一定时间就可以了
------解决方案--------------------
需要为DLL创建一个线程,内部有一个消息循环.
其他的和普通的窗口定时器一样.
当然,也可以有调用者创建这个线程或使用调用者已存在的线程和消息循环.
通过响应WM_TIMER消息,调用你的响应函数.
------解决方案--------------------
雪影老大正解.
你可以在调用者的WM_TIMER里面调用你DLL里的函数嘛
------解决方案--------------------
自己开一个线程,然后利用消息循环,或者自己计算...GetTickCount
------解决方案--------------------
ls
或者假如你的timer响应不需要外部数据
你就这可直接调用
UINT_PTR SetTimer( HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
定义一个static的lpTimerFunc就可以了
------解决方案--------------------
SetTimer()可以
------解决方案--------------------
使用内核定时器多好,连消息循环都不用建的。
供参考:
- C/C++ code
// 析构函数 CTimer::~CTimer() { ITER iter = m_hTimerMap.begin(); ITER enditer = m_hTimerMap.end(); for (; iter != enditer; ++iter) { DeleteTimerQueueTimer(m_hTimerQueue, iter->second, INVALID_HANDLE_VALUE); } DeleteTimerQueueEx(m_hTimerQueue, INVALID_HANDLE_VALUE); } // 创建定时器 BOOL CTimer::Create(PVOID pvCallBack, PVOID pvParam, DWORD dwDueTime, DWORD dwPeriod, ULONG dwFlags) { if (IsExist(pvCallBack)) return FALSE; // 创建定时器队列 if (m_hTimerQueue == NULL) { m_hTimerQueue = CreateTimerQueue(); } // 创建并保存 HANDLE hTimer = NULL; BOOL bRet = CreateTimerQueueTimer( &hTimer, m_hTimerQueue, (WAITORTIMERCALLBACK)pvCallBack, pvParam, dwDueTime, dwPeriod, dwFlags); if (bRet) { m_hTimerMap.insert(TYPE(pvCallBack, hTimer)); } return bRet; } // 修改定时器 BOOL CTimer::Change(PVOID pvCallBack, DWORD dwDueTime, DWORD dwPeriod) { ITER iter = m_hTimerMap.find(pvCallBack); if (iter != m_hTimerMap.end() && ChangeTimerQueueTimer(m_hTimerQueue, iter->second, dwDueTime, dwPeriod)) { return TRUE; } return FALSE; } // 删除定时器 BOOL CTimer::Delete(PVOID pvCallBack, HANDLE hCompletionEvent) { ITER iter = m_hTimerMap.find(pvCallBack); if (iter != m_hTimerMap.end() && DeleteTimerQueueTimer(m_hTimerQueue, iter->second, hCompletionEvent)) { m_hTimerMap.erase(pvCallBack); return TRUE; } return FALSE; } // 清除所有定时器 BOOL CTimer::Clear() { if (m_hTimerMap.size() == 0) return FALSE; for (ITER iter = m_hTimerMap.begin(); iter != m_hTimerMap.end(); ++iter) { DeleteTimerQueueTimer(m_hTimerQueue, iter->second, INVALID_HANDLE_VALUE); } m_hTimerMap.clear(); return TRUE; } // 定时器是否存在 BOOL CTimer::IsExist(PVOID pvCallBack) { ITER iter = m_hTimerMap.find(pvCallBack); if (iter != m_hTimerMap.end()) { return TRUE; } else { return FALSE; } }
------解决方案--------------------
哈 老邓的方法比较牛
------解决方案--------------------
学习一下。
------解决方案--------------------
学习啦