秒数とコールバックを指定すると、指定された秒数の後にコールバックを実行する関数を作成しようとしています。コールバックは同じスレッド上にある必要はありません。対象言語は C++/CX です。
Windows::System::Threading::ThreadPoolTimer を使用してみましたが、結果はメモリ アクセス例外です。問題は、コールバックの実装 (ネイティブ C++) が、タイマーがそのコールバックを実行しているマネージド スレッドからアクセスできないことです。
ref class TimerDoneCallback {
private:
function<void(void)> m_callback;
public:
void EventCallback(ThreadPoolTimer^ timer) {
m_callback(); // <-- memory exception here
}
TimerDoneCallback(function<void(void)> callback) : m_callback(callback) {}
};
void RealTimeDelayCall(const TimeSpan& duration, function<void(void)> callback) {
auto t = ref new TimerDoneCallback(callback);
auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback);
ThreadPoolTimer::CreateTimer(e, duration);
}
void Test() {
RealTimeDelayCall(duration, [](){}); //after a delay, run 'do nothing'
}
多くの同時遅延が発生する可能性があるため、スレッドを作成してその上でスリープしたくありません。