0

Hi

I wonder if any kind soul could help me with a timer problem in c.

I am not at all experienced in writing c code.

In a c dll (called from a vb user control) I need to avoid blocking the parent application, and also be able to abort the dll function if the parent terminates. I want to use a timer for this purpose.

VOID CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD);

//dllFunction
int iTimerID;

	iTimerID = SetTimer (NULL, 0, 200,  (TIMERPROC)TimerProc);
	
	//do some stuff (may take several seconds)
	
	KillTimer(0,iTimerID);
  return;
  
  
  VOID CALLBACK TimerProc(      
      HWND hwnd,
      UINT uMsg,
      UINT_PTR idEvent,
      DWORD dwTime
  )
  {
     MSG Msg = { 0 };
     while( PeekMessage( &Msg, NULL, 0, 0, PM_REMOVE ) == TRUE)
     {
  
         TranslateMessage( &Msg );
         DispatchMessage( &Msg );
      }
  }

The timer is created and a handle returned. However I am obviously doing something wrong as the callback procedure never gets called.

4
Contributors
5
Replies
19
Views
8 Years
Discussion Span
Last Post by vijitris
0

that doesn't work if your program does not have a message pump. I've never tried it in a dll but I do know it doesn't work in a standard C/C++ language console program.

You might want to write a small C windows program that tests your dll to see if you can get the dll to work like you want it.

0

Hi Ancient Dragon

Thanks for taking the time to help and apologies for this slow acknowledgement.

I have tried your suggestion and as you say this code does not work. I have found a way to execute a callback to the vb6 caller at reasonably controllable intervals and and can free it up (and if necessary abort the dll function) that way.

Thanks again for your help.

0

You must process the message OUT from the Callback function.
See the code below. You can run it in windows.
Hope this helps.
oskar

#include "stdafx.h"
#include "windows.h"

VOID CALLBACK Callback1(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
)
{
    printf ("Callback1 called\n");
}



// This function MUST be called to get the timers running if you dont have
// a WindowsProc that handles this timer, that is, if you passed NULL in the 
// first parameter of SetTimer
void ProcessTimerMessages()
{
    HWND hwndTimer=NULL;    // 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 
    } 
}

int main(int argc, char* argv[])
{
    UINT_PTR a;

    a = SetTimer(NULL,             
        0,            
        1000,                  // 1-second interval 
        (TIMERPROC) Callback1);  

    ProcessTimerMessages();

    return 0;
}

Edited by Reverend Jim: Fixed formatting

0

Sorry. There was a bug in the code of my previous post.
Here it goes correctly.

#include "stdio.h"
#include "windows.h"

VOID CALLBACK Callback1(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
)
{
	printf ("Callback1 called\n");
}



// This function MUST be called to get the timers running if you dont have
// a WindowsProc that handles this timer, that is, if you passed NULL in the 
// first parameter of SetTimer
void ProcessTimerMessages()
{
	MSG msg;			
	BOOL ret;
    while (ret=GetMessage(&msg, // message structure 
            NULL,           // handle to window to receive the message 
            NULL,           // lowest message to examine 
            NULL))          // highest message to examine 
	{
		if (ret != -1)
			DispatchMessage(&msg);  // dispatches message to window 
	}
}

int main(int argc, char* argv[])
{
	UINT_PTR a;

	a = SetTimer(NULL,             
		0,            
		250,
		(TIMERPROC) Callback1);  

	ProcessTimerMessages();

	return 0;
}
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.