You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:41:23