gpt4 book ai didi

time - 在 C++/CX 中实现异步延迟

转载 作者:行者123 更新时间:2023-12-04 20:50:59 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,给定秒数和回调,在给定的秒数后运行回调。回调不必在同一个线程上。目标语言是 C++/CX。

我尝试使用 Windows::System::Threading::ThreadPoolTimer,但结果是内存访问异常。问题似乎是无法从计时器正在运行其回调的托管线程访问回调实现(在 native 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'
}

我不想创建一个线程并在其上休眠,因为可能会有很多并发延迟。

最佳答案

TimerDoneCallback 实例未保持事件状态 - C++/CX 中的委托(delegate)对目标对象进行弱引用(以避免循环引用)。您可以通过使用委托(delegate)构造函数的扩展重载来覆盖此行为:

auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback, CallbackContext::Any, true);

最后的 bool 参数对于强引用应该是 true,对于弱引用应该是 false。 (False 是默认值。)

您还可以考虑使用 PPL 代理中的计时器类来进行延迟回调: http://msdn.microsoft.com/en-us/library/hh873170(v=vs.110).aspx以避免需要使用 ThreadPoolTimer。

关于time - 在 C++/CX 中实现异步延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com