Cra*_*ney 5 time interop native callback 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'
}
Run Code Online (Sandbox Code Playgroud)
我不想创建一个线程并在其上休眠,因为可能存在许多并发延迟.
TimerDoneCallback 实例不会保持活动状态 - C++/CX 中的委托采用对目标对象的弱引用(以避免循环引用)。您可以使用委托构造函数的扩展重载来覆盖此行为:
auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback, CallbackContext::Any, true);
Run Code Online (Sandbox Code Playgroud)
最后的 bool 参数对于强引用应该为 true,对于弱引用应该为 false。(默认为 False。)
您还可以考虑使用 PPL 代理中的计时器类来进行延迟回调:http://msdn.microsoft.com/en-us/library/hh873170 (v=vs.110).aspx 以避免需要使用 ThreadPoolTimer。