希望能2秒 运行一下回调
#define _WIN32_WINNT 0x500#include <windows.h>
#include <WinBase.h>#include <time.h>
#include <stdio.h>//VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
#define ID_TIMER 1
VOID
(APIENTRY vvv)(
__in_opt LPVOID lpArgToCompletionRoutine,
__in DWORD dwTimerLowValue,
__in DWORD dwTimerHighValue
);int main()
{ //SetTimer (NULL, ID_TIMER, 1000, TimerProc) ;
//SetTimer(ID_TIMER, 1000, TimerProc) ;
HANDLE hTimer = NULL;
hTimer = CreateWaitableTimer(
NULL, // pointer to security attributes
true, // flag for manual reset state
L"Hello"); LARGE_INTEGER liDueTime; //设置时间为2秒。
const int unitsPerSecond=10*1000*1000;
liDueTime.QuadPart = -2 * unitsPerSecond;
if (!SetWaitableTimer(hTimer,
&liDueTime,
1000,
&vvv,
0,
true
)){
printf("! ok");
} for(;;){
::Sleep(1000);
} return 0;}
VOID
(APIENTRY vvv)(
__in_opt LPVOID lpArgToCompletionRoutine,
__in DWORD dwTimerLowValue,
__in DWORD dwTimerHighValue
)
{
static int x = 0;
printf(" TimerProc %d \n", x);
}
运行起来 没有结果 help
#define _WIN32_WINNT 0x500#include <windows.h>
#include <WinBase.h>#include <time.h>
#include <stdio.h>//VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
#define ID_TIMER 1
VOID
(APIENTRY vvv)(
__in_opt LPVOID lpArgToCompletionRoutine,
__in DWORD dwTimerLowValue,
__in DWORD dwTimerHighValue
);int main()
{ //SetTimer (NULL, ID_TIMER, 1000, TimerProc) ;
//SetTimer(ID_TIMER, 1000, TimerProc) ;
HANDLE hTimer = NULL;
hTimer = CreateWaitableTimer(
NULL, // pointer to security attributes
true, // flag for manual reset state
L"Hello"); LARGE_INTEGER liDueTime; //设置时间为2秒。
const int unitsPerSecond=10*1000*1000;
liDueTime.QuadPart = -2 * unitsPerSecond;
if (!SetWaitableTimer(hTimer,
&liDueTime,
1000,
&vvv,
0,
true
)){
printf("! ok");
} for(;;){
::Sleep(1000);
} return 0;}
VOID
(APIENTRY vvv)(
__in_opt LPVOID lpArgToCompletionRoutine,
__in DWORD dwTimerLowValue,
__in DWORD dwTimerHighValue
)
{
static int x = 0;
printf(" TimerProc %d \n", x);
}
运行起来 没有结果 help
sleep 无法唤醒,对了settimer 和 回调发生在同一个线程吗?
???都是一个线程好不好啊?....printf("thread id %d \n", GetCurrentThreadId());
还有一些疑问,比如多 thread 的程序,当a 设置了timer 以后, 又去做别的活了。过了一会, 可能会被中断,来执行回调吗?如果别的活根本没结束呢?是不是也会象sleep 一样,不会返回, 那么这个回调不久不能运行了吗?如果一定要线程在这里sleepEX等的话, 那岂不是一个线程等一个timer?....
对我反驳得好!问题也问得好!老实说,你还要很多概念没搞清楚,建议先读通MSDN再来反驳我。你到底是在多线程环境还是单线程环境下使用?如果是单线程环境,为何还要问“settimer 和 回调发生在同一个线程吗”?如果是多线程环境,代码根本看不出来哪用的多线程。
当然你完全可以每个定时器使用一个独立的线程,没有任何问题,只不过这不是真正的多线程,只是多个单线程,效率并不高;如果想一个线程多个定时器,建议再去了解一下APC吧,了解清楚再想想我的答案。
所以我需要在connect 成功的时候,为 socket 设置一个timer, 把socket 对象指针放在里面,好让他在以后提醒我。我的疑问就是settimer 和以后 timer 回调的任务是在同一个线程吗?假设我的工作线程 x 和服务器 建立了一个 socket, 然后为这个socket 建立一个timer, 将socket 放入iocp
然后这个线程就要去进行下一个连接了。 如果 timer 回调在这个x 运行, 那么 也许我的x 正在下一个socket
获取,甚至是connect 的时候,就可能被打断,来跑timer 的回调,也可能不会被回调,而导致这个回调不会被激发。如果timer 回调不是在同一个线程,那么它在那里运行呢?C r e a t e Ti m e r Q u e u e Ti m e r 我会去了解的。
虽然我没有写过给予timer 的代码,但是我已经明白了 线程xx
while (TRUE)SleepEx(INFINITE, TRUE); 所有的回调在这里调用建立连接后 线程x 通过QueueUserAPC() 设置 timer
iocp 的处理线程 也通过QueueUserAPC() 销毁timer是这样吧。 唯一的担心是重入。
代码倒是有,最简单的应用之一就是发送网络心跳包或者定时检测,如果你需要,给个邮箱,我把一个封装类发给你。
[email protected]再发一次可以吗? 谢谢。
谢谢。
我想要,谢谢!最近开始搞SOCKET编程了!
我想要,谢谢!最近开始搞SOCKET编程了!