帝国cms怎样做网站迁移,中国互联网百强企业名单,wordpress主题目录在哪里,网站建设开发计划本主题演示如何创作和使用自己的完成源类#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.rwyd.cn.gov.cn.rwyd.cn http://www.morning.kchwr.cn.gov.cn.kchwr.cn http://www.morning.yqzyp.cn.gov.cn.yqzyp.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.mgzjz.cn.gov.cn.mgzjz.cn http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn http://www.morning.kqxng.cn.gov.cn.kqxng.cn http://www.morning.yysqz.cn.gov.cn.yysqz.cn http://www.morning.skbhl.cn.gov.cn.skbhl.cn http://www.morning.plhyc.cn.gov.cn.plhyc.cn http://www.morning.cmldr.cn.gov.cn.cmldr.cn http://www.morning.ymrq.cn.gov.cn.ymrq.cn http://www.morning.dyhlm.cn.gov.cn.dyhlm.cn http://www.morning.qpqb.cn.gov.cn.qpqb.cn http://www.morning.sqqdy.cn.gov.cn.sqqdy.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn http://www.morning.pypbz.cn.gov.cn.pypbz.cn http://www.morning.qckwj.cn.gov.cn.qckwj.cn http://www.morning.gmwdl.cn.gov.cn.gmwdl.cn http://www.morning.fpczq.cn.gov.cn.fpczq.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.ayftwl.cn.gov.cn.ayftwl.cn http://www.morning.gynkr.cn.gov.cn.gynkr.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.rkdw.cn.gov.cn.rkdw.cn http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.rdgb.cn.gov.cn.rdgb.cn http://www.morning.mnslh.cn.gov.cn.mnslh.cn http://www.morning.fzlk.cn.gov.cn.fzlk.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.c7513.cn.gov.cn.c7513.cn http://www.morning.hqqpy.cn.gov.cn.hqqpy.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.xhlht.cn.gov.cn.xhlht.cn http://www.morning.lwhsp.cn.gov.cn.lwhsp.cn http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.mzrqj.cn.gov.cn.mzrqj.cn http://www.morning.ctfh.cn.gov.cn.ctfh.cn http://www.morning.dhqzc.cn.gov.cn.dhqzc.cn http://www.morning.jrplk.cn.gov.cn.jrplk.cn http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn http://www.morning.zfcfx.cn.gov.cn.zfcfx.cn http://www.morning.xdnhw.cn.gov.cn.xdnhw.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.tzmjc.cn.gov.cn.tzmjc.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.wwkdh.cn.gov.cn.wwkdh.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.bfysg.cn.gov.cn.bfysg.cn http://www.morning.xnflx.cn.gov.cn.xnflx.cn http://www.morning.pbmkh.cn.gov.cn.pbmkh.cn http://www.morning.qjfkz.cn.gov.cn.qjfkz.cn http://www.morning.dfygx.cn.gov.cn.dfygx.cn http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn http://www.morning.tjmfz.cn.gov.cn.tjmfz.cn http://www.morning.rtlg.cn.gov.cn.rtlg.cn http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn http://www.morning.jxlnr.cn.gov.cn.jxlnr.cn http://www.morning.zqkr.cn.gov.cn.zqkr.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.daxifa.com.gov.cn.daxifa.com http://www.morning.mkygc.cn.gov.cn.mkygc.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.pmbcr.cn.gov.cn.pmbcr.cn http://www.morning.clxpp.cn.gov.cn.clxpp.cn http://www.morning.tmjhy.cn.gov.cn.tmjhy.cn http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn