Реализация асинхронной задержки в C++/CX

Я пытаюсь написать функцию, которая, учитывая количество секунд и обратный вызов, запускает обратный вызов через заданное количество секунд. Обратный вызов не обязательно должен быть в том же потоке. Целевой язык — 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'
}

Я не хочу создавать поток и спать в нем, потому что может быть много одновременных задержек.

5
задан Craig Gidney 27 May 2012 в 20:25
поделиться