-1

以前は 32 ビット Windows で動作していた 32 ビット Windows C++ アプリケーションを、64 ビットWindowsマシンで使用する必要があります。VisualStudio2008を使用。コールは

SetTimer(m_hWnd, nTimerID, nElapse, *pReceiver)

にありますWinUser.h

コンパイル時にプリプロセッサの定義を から に変更WIN32しました。WIN64アプリケーションは 64 ビット PC でコンパイルおよび実行されますが、コールバックはトリガーされません (アプリケーションの動作から明らかです)。

これを機能させるための回避策はありますか?

4

1 に答える 1

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;


 };
于 2013-01-11T14:13:25.380 に答える