Create and Receive Timer Event in WIN32 DLL

Dear Experts:

I would like to know if there is any ways to create a Timer say 500ms and a Timer Event Handler in a traditional WIN32 DLL??

If sample code can provide will be even better.

Thanks in advance

Viper Venom
viper_gtsAsked:
Who is Participating?
 
fl0ydConnect With a Mentor Commented:
Hi viper_gts,
there is a function
UINT_PTR SetTimer( HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc )
that suits your needs. You can use it either by specifying your own callback-routine or handle the WM_TIMER messages in your main window procedure. In the latter case set
lpTimerFunc = NULL;
Don't forget to link to User32.lib and #include "windows.h".

.f
0
 
Roshan DavisCommented:
MSDN Says

Creating a Timer
The following example uses the SetTimer function to create two timers. The first timer is set for every 10 seconds, the second for every 5 minutes.

// Set two timers.
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER1,            // timer identifier
    10000,                 // 10-second interval
    (TIMERPROC) NULL);     // no timer callback
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER2,            // timer identifier
    300000,                // 5-minute interval
    (TIMERPROC) NULL);     // no timer callback
To process the WM_TIMER messages generated by these timers, add a WM_TIMER case statement to the window procedure for the hwnd parameter.

case WM_TIMER:
 
    switch (wParam)
    {
        case IDT_TIMER1:
            // Process the 10-second timer.
 
             return 0;
 
        case IDT_TIMER2:
            // Process the 5-minute timer.

            return 0;
    }
An application can also create a timer whose WM_TIMER messages are processed not by the main window procedure but by an application-defined callback function, as in the following code sample, which creates a timer and uses the callback function MyTimerProc to process the timer's WM_TIMER messages.

// Set the timer.
 
SetTimer(hwnd,                // handle to main window
    IDT_TIMER3,               // timer identifier
    5000,                     // 5-second interval
    (TIMERPROC) MyTimerProc); // timer callback
The calling convention for MyTimerProc must be based on the TimerProc callback function.

If your application creates a timer without specifying a window handle, your application must monitor the message queue for WM_TIMER messages and dispatch them to the appropriate window. Note that GetMessage can return -1 if there is an error.

HWND hwndTimer;   // handle to window for timer messages
MSG msg;          // message structure
 
    while (GetMessage(&msg, // message structure
            NULL,           // handle to window to receive the message
            NULL,           // lowest message to examine
            NULL)          // highest message to examine
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    {
 
        // Post WM_TIMER messages to the hwndTimer procedure.
 
        if (msg.message == WM_TIMER)
        {
            msg.hwnd = hwndTimer;
        }
 
        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }

GOOD LUCK
0
 
Roshan DavisCommented:
MSDN Says

Creating a Timer
The following example uses the SetTimer function to create two timers. The first timer is set for every 10 seconds, the second for every 5 minutes.

// Set two timers.
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER1,            // timer identifier
    10000,                 // 10-second interval
    (TIMERPROC) NULL);     // no timer callback
 
SetTimer(hwnd,             // handle to main window
    IDT_TIMER2,            // timer identifier
    300000,                // 5-minute interval
    (TIMERPROC) NULL);     // no timer callback
To process the WM_TIMER messages generated by these timers, add a WM_TIMER case statement to the window procedure for the hwnd parameter.

case WM_TIMER:
 
    switch (wParam)
    {
        case IDT_TIMER1:
            // Process the 10-second timer.
 
             return 0;
 
        case IDT_TIMER2:
            // Process the 5-minute timer.

            return 0;
    }
An application can also create a timer whose WM_TIMER messages are processed not by the main window procedure but by an application-defined callback function, as in the following code sample, which creates a timer and uses the callback function MyTimerProc to process the timer's WM_TIMER messages.

// Set the timer.
 
SetTimer(hwnd,                // handle to main window
    IDT_TIMER3,               // timer identifier
    5000,                     // 5-second interval
    (TIMERPROC) MyTimerProc); // timer callback
The calling convention for MyTimerProc must be based on the TimerProc callback function.

If your application creates a timer without specifying a window handle, your application must monitor the message queue for WM_TIMER messages and dispatch them to the appropriate window. Note that GetMessage can return -1 if there is an error.

HWND hwndTimer;   // handle to window for timer messages
MSG msg;          // message structure
 
    while (GetMessage(&msg, // message structure
            NULL,           // handle to window to receive the message
            NULL,           // lowest message to examine
            NULL)          // highest message to examine
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    {
 
        // Post WM_TIMER messages to the hwndTimer procedure.
 
        if (msg.message == WM_TIMER)
        {
            msg.hwnd = hwndTimer;
        }
 
        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }

GOOD LUCK
0
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

 
viper_gtsAuthor Commented:
Thank you for such a fast response.

Please correct me if I am wrong but I think in a traditional WIN32 does not have a window own by itself.

Therefore, both way cannot be implement in this case.

Viper Venom
0
 
fl0ydCommented:
p.s.: Took me toooooo long to type.....

What exactly do you mean by 'traditional WIN32'? I assume, you're talking about an command-line-application without a GUI. You can still use ::SetTimer(...), as you don't have to specify a window handle. In that case make sure to provide your own callback-function.

.f
0
 
Roshan DavisCommented:
You can set NULL, for window, So u can set only one timer, But in ur case this may okay... right ?

Roshmon
0
 
viper_gtsAuthor Commented:
Actually, I am trying to write a small test program and see if it works.

Thank you for all you help.

Viper Venom
0
 
pjknibbsCommented:
fl0yd: This method will only work if the program which launches the DLL has a message loop. 99% of Windows programs DO have a message loop, of course, but I'm not sure you can guarantee this when the timer is being used in a DLL.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.