64-битная совместимость для 32-битного обратного вызова SetTimer Windows

Предыдущее работающее 32-битное приложение Windows C ++ на 32-битные окна теперь нужно использовать на машине с 64-битным Windows. Использование VisualStudio2008. Звонок

SetTimer(m_hWnd, nTimerID, nElapse, *pReceiver)

который может быть найден в WinUser.h,

Я изменил свои определения препроцессора с WIN32 в WIN64 при компиляции. Приложение компилируется и запускается на 64-битном ПК, но обратный вызов не запускается (поведение приложения делает это очевидным).

Есть ли обходной путь, чтобы заставить это работать?

-1

Решение

 class DelayedAction
{

public:
DelayedAction( int expirePeriod, boost::function<void()> callback ):
work( service),
thread( boost::bind( &DelayedAction::run, this)),
timer( service),
m_callback(callback),
m_expirePeriod(expirePeriod)
{}

~DelayedAction()
{
thread.join();
}

void startTimer()
{
}

void on_some_event()
{
startAfter(m_expirePeriod);
}

void stop()
{
timer.cancel();
}

void startAfter( const size_t delay)
{
// no need to explicitly cancel
// timer.cancel();
timer.expires_from_now( boost::posix_time::seconds( delay) );
timer.async_wait( boost::bind( &DelayedAction::action, this, boost::asio::placeholders::error));
}private:
void run()
{
service.run();
}

// ...

void action(const boost::system::error_code& e)
{
if(e != boost::asio::error::operation_aborted)
std::cout << "action" << std::endl;
m_callback();
}

int m_expirePeriod;
boost::function<void()> m_callback;

boost::asio::io_service         service;
boost::asio::io_service::work   work;
boost::thread                   thread;
boost::asio::deadline_timer     timer;};
0

Другие решения

Других решений пока нет …