求C++/WinRT中DispatcherTimer创建周期性定时器的示例代码
C++/WinRT中使用DispatcherTimer创建周期性定时器的示例
没问题,我知道官方文档里的示例大多是C++/CX的,转成C++/WinRT确实有几个关键的语法差异需要注意,比如对象创建方式、事件注册的写法。下面给你一个完整可运行的C++/WinRT示例,包含核心逻辑和注释:
完整示例代码
头文件(MainPage.h)
#pragma once #include "MainPage.g.h" namespace winrt::YourAppName::implementation { struct MainPage : MainPageT<MainPage> { MainPage(); // 定时器对象,作为成员变量保存避免被销毁 winrt::Windows::UI::Xaml::DispatcherTimer m_timer; // 用于记录触发次数的变量 int32_t m_tickCount = 0; void StartTimer(); void TimerTick(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::Foundation::IInspectable const& args); }; } namespace winrt::YourAppName::factory_implementation { struct MainPage : MainPageT<MainPage, implementation::MainPage> { }; }
实现文件(MainPage.cpp)
#include "pch.h" #include "MainPage.h" #include "MainPage.g.cpp" using namespace winrt; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; namespace winrt::YourAppName::implementation { MainPage::MainPage() { InitializeComponent(); // 可以在这里直接调用StartTimer,或者绑定到按钮点击事件 } void MainPage::StartTimer() { // 创建DispatcherTimer实例(C++/WinRT不用ref new,直接构造即可) m_timer = Windows::UI::Xaml::DispatcherTimer(); // 设置定时器间隔为1秒(TimeSpan单位是100纳秒,所以1秒=10000000) m_timer.Interval(Windows::Foundation::TimeSpan{ 10000000 }); // 注册Tick事件处理函数(C++/WinRT用+=绑定,注意函数签名要匹配) m_timer.Tick({ this, &MainPage::TimerTick }); // 启动定时器 m_timer.Start(); } void MainPage::TimerTick(IInspectable const& /*sender*/, IInspectable const& /*args*/) { m_tickCount++; // 示例:更新UI上的文本块显示次数(假设你有一个名为TickCountText的TextBlock控件) if (auto textBlock = this->TickCountText()) { textBlock.Text(L"定时器触发次数: " + winrt::to_hstring(m_tickCount)); } } }
关键语法差异说明
- 对象创建:C++/CX用
ref new,C++/WinRT直接使用构造函数(DispatcherTimer这类控件直接构造即可,部分对象可用winrt::make) - 事件绑定:C++/CX用
+= ref new EventHandler<...>(this, &Class::Method),C++/WinRT简化为+= { this, &Class::Method } - 成员变量管理:C++/WinRT不需要用
^跟踪引用,直接用对象类型声明成员变量即可(比如DispatcherTimer m_timer)
注意事项
- DispatcherTimer运行在UI线程,所以Tick事件处理函数可以直接更新UI,不需要额外调度
- 如果需要停止定时器,调用
m_timer.Stop()即可 - 确保定时器对象(比如示例中的
m_timer)是类的成员变量,避免局部变量被销毁导致定时器失效
内容的提问来源于stack exchange,提问作者user3743210
相关产品推荐
相关产品推荐

