希望能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

解决方案 »

  1.   

    哦明白了
    sleep 无法唤醒,对了settimer 和 回调发生在同一个线程吗?
      

  2.   

    settimer是在主线程中运行的,回调是在SleepEx所在线程中运行的
      

  3.   

    同一线程,所以Sleep的时候才不会执行。自己GetCurrentThreadId对比一下,或者用任务管理器看看进程的线程数就知道了。
      

  4.   

    settimer是在主线程中运行的,回调是在SleepEx所在线程中运行的
    ???都是一个线程好不好啊?....printf("thread id %d \n", GetCurrentThreadId());
    还有一些疑问,比如多 thread 的程序,当a 设置了timer 以后, 又去做别的活了。过了一会, 可能会被中断,来执行回调吗?如果别的活根本没结束呢?是不是也会象sleep 一样,不会返回, 那么这个回调不久不能运行了吗?如果一定要线程在这里sleepEX等的话, 那岂不是一个线程等一个timer?....
      

  5.   


    对我反驳得好!问题也问得好!老实说,你还要很多概念没搞清楚,建议先读通MSDN再来反驳我。你到底是在多线程环境还是单线程环境下使用?如果是单线程环境,为何还要问“settimer 和 回调发生在同一个线程吗”?如果是多线程环境,代码根本看不出来哪用的多线程。
    当然你完全可以每个定时器使用一个独立的线程,没有任何问题,只不过这不是真正的多线程,只是多个单线程,效率并不高;如果想一个线程多个定时器,建议再去了解一下APC吧,了解清楚再想想我的答案。
      

  6.   

    WaitableTimer有两种用法:一种是使用等待函数例如WaitForSingleObject等待定时器句柄,时间到了之后继续执行后面的代码;另一种是设置一个回调函数(就是你现在的用法),这个函数需要当前线程(调用SetWaitableTimer的线程)处于alertable等待状态,例如SleepEx、WaitForSingleObjectEx等函数指定bAlertable参数为TRUE。
      

  7.   

    .... 很明显 我的业务不是这么简单的。timer 我并不熟悉,所以才来请教。这个demo 只是为了测试一下 timer 是否有效而已。我的业务是处理多个socket, 因为 socket 需要处理超时的问题,
    所以我需要在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 我会去了解的。
      

  8.   

    你是希望定时器激活的时候不要影响原有的工作,原有工作也不要影响定时器回调,当然应该使用多线程,主线程根本不需要使用WaitXXX调用(因为这会暂停自身的其他功能运行),通过timer使用异步过程调用是最完美的解决方案。创建一个独立的线程,线程函数代码其实只需要一行代码:while (TRUE)SleepEx(INFINITE, TRUE);即可,剩下的事情交给APC来做,由主线程通过QueueUserAPC()来控制整个timer的创建、设置、销毁,所有回调都会自动按照设置在新线程中被执行,主线程尽管干别的事去吧
      

  9.   

    你是希望定时器激活的时候不要影响原有的工作,原有工作也不要影响定时器回调,当然应该使用多线程,主线程根本不需要使用WaitXXX调用(因为这会暂停自身的其他功能运行),通过timer使用异步过程调用是最完美的解决方案。创建一个独立的线程,线程函数代码其实只需要一行代码:while (TRUE)SleepEx(INFINITE, TRUE);即可,剩下的事情交给APC来做,由主线程通过QueueUserAPC()来控制整个timer的创建、设置、销毁,所有回调都会自动按照设置在新线程中被执行,主线程尽管干别的事去吧
    虽然我没有写过给予timer 的代码,但是我已经明白了 线程xx
    while (TRUE)SleepEx(INFINITE, TRUE);  所有的回调在这里调用建立连接后  线程x   通过QueueUserAPC() 设置 timer
    iocp 的处理线程 也通过QueueUserAPC() 销毁timer是这样吧。  唯一的担心是重入。
      

  10.   

    放心吧,只要你的代码自身没有递归调用就不会发生重入。操作系统对待重入是非常小心的,有重入可能的API(比如DispatchMessage)都会交给用户来调用,内核自身不会主动调用。
      

  11.   

    to zhoujianhei:
    代码倒是有,最简单的应用之一就是发送网络心跳包或者定时检测,如果你需要,给个邮箱,我把一个封装类发给你。
      

  12.   

    已发邮件,其他想要的人可以留下email
      

  13.   

    没收到,
    [email protected]再发一次可以吗? 谢谢。
      

  14.   

    [email protected]
    谢谢。
      

  15.   

       
        我想要,谢谢!最近开始搞SOCKET编程了!
     
      

  16.   

    不知道晚不,我邮箱,[email protected],看到的话麻烦也给份吧!
      

  17.   


      我想要,谢谢!最近开始搞SOCKET编程了!