【问题标题】:How to initialize cppwinrt TimeSpan struct?如何初始化 cppwinrt TimeSpan 结构?
【发布时间】:2022-02-28 04:15:30
【问题描述】:

根据 cppwinrt 的主文档迁移 C++...,“用于设置 Windows 运行时属性值的等效 C++/WinRT 源代码调用与 Windows 运行时属性同名的方法和用于新值:

record.UserState(newValue); // Set the UserState property

但这在尝试设置 Duration 对象的 TimeSpan 属性时似乎不起作用:

TimeSpan ts = TimeSpan(6000000);
Duration duration = Duration();
duration.TimeSpan(ts);

第三行在“duration”上产生一个智能感知错误:“调用类类型的对象,没有适当的运算符或将函数转换为指针到函数类型。”同一行的构建错误是“术语不评估为采用 1 个参数的函数”。我应该补充一点,Duration 的构造函数似乎有一个参数,一个 TimeSpan,但这也不被接受。使用 cppwinrt 时如何设置 Duration 的 TimeSpan 属性?

【问题讨论】:

    标签: c++-winrt


    【解决方案1】:

    请记住,在 C++/WinRT 中,Windows::Foundation::TimeSpan 只是 std::chrono::duration 的 typedef,因此您可以使用 std::chrono 的有用功能。

    直接初始化:

    Duration duration{ std::chrono::milliseconds{ 100 }, DurationType::Automatic };

    单独设置:

    Duration duration{ }; duration.TimeSpan = std::chrono::milliseconds{ 100 };

    【讨论】:

    • 呃,那是什么负面评价,甚至没有评论为什么?
    【解决方案2】:

    好的,我想我可以回答我自己的问题。虽然它在 MSDN .NET 文档中称为 Duration 的“属性”,但在此 cppwinrt 环境中 TimeSpan 不是 Duration 的属性,而是 Duration 结构的数据值。所以你不要使用上述设置属性的方法来设置它;你这样设置:

    TimeSpan ts = TimeSpan(6000000);
    Duration duration = Duration();
    duration.TimeSpan = ts;
    

    希望能帮助遇到类似情况的其他人...

    【讨论】:

      【解决方案3】:

      Windows::Foundation::TimeSpan 已定义

      using TimeSpan = std::chrono::duration<int64_t, impl::filetime_period>;
      

      所以当你有一个函数采用TimeSpan,比如DispatcherQueueTimer::Interval,你可以简单地做

      timer.Interval(std::chrono::seconds{ 1 });
      

      using namespace std::literals::chrono_literals; timer.Interval(1s);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多