2013-01-09 30 views
-1

上工作32位Windows C++上32位Windows应用 64位兼容现在需要64位Windows机器上使用。使用VisualStudio2008。电话是在32位的Windows SetTimer的回调

SetTimer(m_hWnd, nTimerID, nElapse, *pReceiver)

可以在WinUser.h被发现。

我编译时,改变了我的预处理器定义从WIN32WIN64。应用程序编译并在64位电脑上运行,但回调没有被触发(应用程序的行为使这一点很明显)。

是否有变通方法来得到这个工作?

+1

太少信息,以发现问题。显然,SetTimer应该在64位Windows下正常工作。如果没有,则表明存在细微的使用问题。 (由于SetTimer的荒谬复杂性,这并不令人惊讶)。任务不是找到解决方法,而是找到bug。 –

+0

请张贴定义和初始化传递给'SetTimer'四个变量的代码。 –

+0

塞巴斯蒂安雷德尔,我认为你是对的。计时器使用微软thunk为32位,这意味着它不是便携式。 –

回答

0
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

我已经取代了旧的计时器与升压deadline_timer,希望它工作;-) –