int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{  
UINT time_out = 3000;          SetTimer(NULL, 0, time_out, (TIMERPROC)TimerHandler); 
         
MSG message;
while(TRUE)
{
while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
 
          return 0;}VOID CALLBACK TimerHandler( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
   printf("Hello World!\n"); }加入下面这段代码
while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
使settimer 起作用
但是这样占用CPU不是太多?
有没有别的办法?
还有这断代码什么意思?

解决方案 »

  1.   

    这段代码是用来进行消息循环的,用来接受消息(这里主要是WM_TIMER消息)
    标准Windows程序应该都有,如果不循环,一个main跑一次就结束了,就无法收到定时消息了
      

  2.   

    nIDEvent
    [in] Specifies a nonzero timer identifier. 楼主定时器ID为0也行?
      

  3.   

    将 while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) 替换为 
      while (::GetMessage(&message, NULL, 0, 0))
    就不占用CPU了代码就是一个通过Windows的消息机制来实现的简单定时器,每隔3秒打印一次
      

  4.   

    这段代码好像不伦不类啊
    控制台的入口函数,win32的程序体
      

  5.   

    参考这个#include <windows.h>/*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil){
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */    /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);    /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;    /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;    /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );    /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);    /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }    /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    /*  This function is called by the Windows function DispatchMessage()  */LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_KEYDOWN:
                MessageBox(NULL,"a","b",MB_OK);
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }    return 0;
    }
      

  6.   

    在控制台中使用定时器,
    while (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }
    }
    可以使程序不退出,且不阻塞窗口的消息循环