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