社区网站建设资金申请,个人工商户做网站备案,网站视频下载方法,服务器维护要多久本主题演示如何创作和使用自己的完成源类#xff0c;类似于 .NET 的 TaskCompletionSource。 completion_source 示例的源代码
下面的列表中的代码作为示例提供。 其目的是说明如何编写自己的版本。 例如#xff0c;支持取消和错误传播不在此示例的范围内。
#include w…本主题演示如何创作和使用自己的完成源类类似于 .NET 的 TaskCompletionSource。 completion_source 示例的源代码
下面的列表中的代码作为示例提供。 其目的是说明如何编写自己的版本。 例如支持取消和错误传播不在此示例的范围内。
#include winrt/base.h
#include windows.htemplate typename T
struct completion_source
{completion_source(){m_signal.attach(::CreateEvent(nullptr, true, false, nullptr));}void set(T const value){m_value value;::SetEvent(m_signal.get());}bool await_ready() const noexcept{return ::WaitForSingleObject(m_signal.get(), 0) 0;}void await_suspend(std::experimental::coroutine_handle resume){m_wait.attach(winrt::check_pointer(::CreateThreadpoolWait(callback, resume.address(), nullptr)));::SetThreadpoolWait(m_wait.get(), m_signal.get(), nullptr);}T await_resume() const noexcept{return m_value;}private:static void __stdcall callback(PTP_CALLBACK_INSTANCE, void* context, PTP_WAIT, TP_WAIT_RESULT) noexcept{std::experimental::coroutine_handle::from_address(context)();}struct wait_traits{using type PTP_WAIT;static void close(type value) noexcept{::CloseThreadpoolWait(value);}static constexpr type invalid() noexcept{return nullptr;}};winrt::handle m_signal;winrt::handle_typewait_traits m_wait;T m_value{};
};将完成卸载到单独的协同程序
本部分演示 completion_source 的一个用例。 在 Visual Studio 中创建一个基于 Windows 控制台应用程序 (C/WinRT) 项目模板的新项目然后将以下代码清单粘贴到 main.cpp根据上一节中的列表展开 completion_source 的定义。 // main.cpp
#include pch.h#include winrt/base.h
#include windows.htemplate typename T
struct completion_source
{//构造函数completion_source(){m_signal.attach(::CreateEvent(nullptr, true, false, nullptr));}void set(T const value){m_value value;::SetEvent(m_signal.get());//将指定的事件对象设置为信号状态。}//准备bool await_ready() const noexcept{return ::WaitForSingleObject(m_signal.get(), 0) 0;//等待指定的对象处于信号状态或超时间隔已过。若要进入可警报等待状态请使用 WaitForSingleObjectEx 函数。 若要等待多个对象请使用 WaitForMultipleObjects。}//暂停void await_suspend(std::experimental::coroutine_handle resume){//CreateThreadpoolWait创建新的等待对象。//参数1[in] pfnwa 等待完成或超时时要调用的回调函数。//参数2[in, out, optional] pv 要传递给回调函数的可选应用程序定义数据。//参数3[in, optional] pcbe 定义执行回调的环境 的TP_CALLBACK_ENVIRON 结构。 InitializeThreadpoolEnvironment 函数返回此结构。如果此参数为 NULL则回调在默认回调环境中执行。 有关详细信息请参阅 InitializeThreadpoolEnvironment。m_wait.attach(winrt::check_pointer(::CreateThreadpoolWait(callback, resume.address(), nullptr)));::SetThreadpoolWait(m_wait.get(), m_signal.get(), nullptr);//设置 wait 对象替换上一个等待对象如果有。 工作线程在句柄发出信号后或在指定的超时过期后调用 wait 对象的回调函数。}//返回m_valueT await_resume() const noexcept{return m_value;}private://回调函数static void __stdcall callback(PTP_CALLBACK_INSTANCE, void* context, PTP_WAIT, TP_WAIT_RESULT) noexcept{std::experimental::coroutine_handle::from_address(context)();}struct wait_traits{using type PTP_WAIT;//释放指定的等待对象valuestatic void close(type value) noexcept //noexcept指定某个函数是否可能会引发异常{::CloseThreadpoolWait(value);//释放指定的等待对象。}//返回空指针static constexpr type invalid() noexcept //constexpr它表示 constant常数表达式。 与 const 一样它可以应用于变量如果任何代码试图 modify修改该值将引发编译器错误。{return nullptr; }};winrt::handle m_signal; //会话句柄winrt::handle_typewait_traits m_wait;T m_value{};
};using namespace winrt;
using namespace Windows::Foundation;
using namespace std::literals;fire_and_forget CompleteAfterFiveSecondsAsync(completion_sourcebool completionSource)
{co_await 5s;completionSource.set(true);
}IAsyncAction CompletionSourceExample1Async()
{completion_sourcebool completionSource;CompleteAfterFiveSecondsAsync(completionSource);co_await completionSource;
}int main()
{auto asyncAction{ CompletionSourceExample1Async() };puts(waiting);asyncAction.get();puts(done);
}将 completion_source 封装在类中并返回一个值
在下一个示例中使用简单的 App 类封装 completion_source并在完成时返回值。 在 Visual Studio 中创建一个基于 Windows 控制台应用程序 (C/WinRT) 项目模板的新项目然后将以下代码清单粘贴到 main.cpp根据上一节中的列表展开 completion_source 的定义。
// main.cpp
#include pch.h#include winrt/base.h
#include windows.htemplate typename T
struct completion_source
{//构造函数completion_source(){m_signal.attach(::CreateEvent(nullptr, true, false, nullptr));}void set(T const value){m_value value;::SetEvent(m_signal.get());//将指定的事件对象设置为信号状态。}//准备bool await_ready() const noexcept{return ::WaitForSingleObject(m_signal.get(), 0) 0;//等待指定的对象处于信号状态或超时间隔已过。若要进入可警报等待状态请使用 WaitForSingleObjectEx 函数。 若要等待多个对象请使用 WaitForMultipleObjects。}//暂停void await_suspend(std::experimental::coroutine_handle resume){//CreateThreadpoolWait创建新的等待对象。//参数1[in] pfnwa 等待完成或超时时要调用的回调函数。//参数2[in, out, optional] pv 要传递给回调函数的可选应用程序定义数据。//参数3[in, optional] pcbe 定义执行回调的环境 的TP_CALLBACK_ENVIRON 结构。 InitializeThreadpoolEnvironment 函数返回此结构。如果此参数为 NULL则回调在默认回调环境中执行。 有关详细信息请参阅 InitializeThreadpoolEnvironment。m_wait.attach(winrt::check_pointer(::CreateThreadpoolWait(callback, resume.address(), nullptr)));::SetThreadpoolWait(m_wait.get(), m_signal.get(), nullptr);//设置 wait 对象替换上一个等待对象如果有。 工作线程在句柄发出信号后或在指定的超时过期后调用 wait 对象的回调函数。}//返回m_valueT await_resume() const noexcept{return m_value;}private://回调函数static void __stdcall callback(PTP_CALLBACK_INSTANCE, void* context, PTP_WAIT, TP_WAIT_RESULT) noexcept{std::experimental::coroutine_handle::from_address(context)();}struct wait_traits{using type PTP_WAIT;//释放指定的等待对象valuestatic void close(type value) noexcept //noexcept指定某个函数是否可能会引发异常{::CloseThreadpoolWait(value);//释放指定的等待对象。}//返回空指针static constexpr type invalid() noexcept //constexpr它表示 constant常数表达式。 与 const 一样它可以应用于变量如果任何代码试图 modify修改该值将引发编译器错误。{return nullptr; }};winrt::handle m_signal; //会话句柄winrt::handle_typewait_traits m_wait;T m_value{};
};using namespace winrt;
using namespace Windows::Foundation;
using namespace std::literals;struct App
{completion_sourcewinrt::hstring m_completionSource;IAsyncOperationwinrt::hstring CompletionSourceExample2Async(){co_return co_await m_completionSource;}winrt::fire_and_forget CompleteAfterFiveSecondsAsync(){co_await 5s;m_completionSource.set(LHello, World!);}
};int main()
{App app;auto asyncAction{ app.CompletionSourceExample2Async() };app.CompleteAfterFiveSecondsAsync();puts(waiting);auto message asyncAction.get();printf(%ls\n, message.c_str());
} 文章转载自: http://www.morning.huihuangwh.cn.gov.cn.huihuangwh.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.qczjc.cn.gov.cn.qczjc.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.zlchy.cn.gov.cn.zlchy.cn http://www.morning.lzrpy.cn.gov.cn.lzrpy.cn http://www.morning.bfsqz.cn.gov.cn.bfsqz.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.rzmkl.cn.gov.cn.rzmkl.cn http://www.morning.hphqy.cn.gov.cn.hphqy.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.xrpjr.cn.gov.cn.xrpjr.cn http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn http://www.morning.mlnby.cn.gov.cn.mlnby.cn http://www.morning.htfnz.cn.gov.cn.htfnz.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.thwhn.cn.gov.cn.thwhn.cn http://www.morning.lyjwb.cn.gov.cn.lyjwb.cn http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn http://www.morning.xnrgb.cn.gov.cn.xnrgb.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.lksgz.cn.gov.cn.lksgz.cn http://www.morning.pxspq.cn.gov.cn.pxspq.cn http://www.morning.hwprz.cn.gov.cn.hwprz.cn http://www.morning.xnfg.cn.gov.cn.xnfg.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.qjzgj.cn.gov.cn.qjzgj.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.wjpsn.cn.gov.cn.wjpsn.cn http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn http://www.morning.nlpbh.cn.gov.cn.nlpbh.cn http://www.morning.srgnd.cn.gov.cn.srgnd.cn http://www.morning.nzklw.cn.gov.cn.nzklw.cn http://www.morning.gqksd.cn.gov.cn.gqksd.cn http://www.morning.pamdeer.com.gov.cn.pamdeer.com http://www.morning.rbffj.cn.gov.cn.rbffj.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.mjtgt.cn.gov.cn.mjtgt.cn http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn http://www.morning.zcncb.cn.gov.cn.zcncb.cn http://www.morning.hxljc.cn.gov.cn.hxljc.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.ksgjy.cn.gov.cn.ksgjy.cn http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn http://www.morning.wmdbn.cn.gov.cn.wmdbn.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.krdmn.cn.gov.cn.krdmn.cn http://www.morning.sjli222.cn.gov.cn.sjli222.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.wtdhm.cn.gov.cn.wtdhm.cn http://www.morning.snbq.cn.gov.cn.snbq.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.xqgtd.cn.gov.cn.xqgtd.cn http://www.morning.wrfk.cn.gov.cn.wrfk.cn http://www.morning.lthgy.cn.gov.cn.lthgy.cn http://www.morning.kxypt.cn.gov.cn.kxypt.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.fcpjq.cn.gov.cn.fcpjq.cn http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.nfcxq.cn.gov.cn.nfcxq.cn