using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Threading; namespace CapMachine.Wpf.Models { /// /// 程序运行时间统计 /// public class ProRunTimeCalc : BindableBase { public ProRunTimeCalc() { //秒触发一次 CycleTimer = new System.Timers.Timer(1000); CycleTimer.Elapsed += ProRunCycleAction; CycleTimer.AutoReset = true; CycleTimer.Enabled = true; } /// /// 程序运行时间周期统计 /// /// /// /// private void ProRunCycleAction(object? sender, ElapsedEventArgs e) { CycleTimer.Stop(); Application.Current.Dispatcher.BeginInvoke(new Action(() => { CalcTime(); })); CycleTimer.Start(); } /// /// 统计时间 /// private void CalcTime() { ProEndDt = DateTime.Now; ProRunTimeStr = ConvertSecToDHMS((int)Math.Round((ProEndDt - ProStartDt).TotalSeconds - PauseTotalSecTime)); } private string ConvertSecToDHMS(int totalSeconds) { // 驗證非負(可根據需求調整) if (totalSeconds < 0) return "00天:00时:00分:00秒"; int days = totalSeconds / 86400; // 1天 = 86400秒 int remainingSeconds = totalSeconds % 86400; int hours = remainingSeconds / 3600; // 1小時 = 3600秒 remainingSeconds %= 3600; int minutes = remainingSeconds / 60; // 1分鐘 = 60秒 int seconds = remainingSeconds % 60; // 格式化輸出,確保時、分、秒為兩位數 return $"{days}天:{hours:D2}时:{minutes:D2}分:{seconds:D2}秒"; } /// /// 开始计时 /// public void StartProRunTime() { ProStartDt = DateTime.Now; CycleTimer.Start(); //暂停时间清零,可能是多次开始执行程序,导致PauseTotalSecTime残留到下一个程序计时中 PauseTotalSecTime = 0; } /// /// 暂停计时 /// public void PauseProRunTime() { CycleTimer.Stop(); } /// /// 继续计时 /// public void ContinueProRunTime() { CycleTimer.Start(); } /// /// 结束计时 /// public void EndProRunTime() { CycleTimer.Stop(); CalcTime(); //暂停时间清零,可能是多次开始执行程序,导致PauseTotalSecTime残留到下一个程序计时中 PauseTotalSecTime = 0; } /// /// 周期定时器 /// private System.Timers.Timer CycleTimer { get; set; } /// /// 程序开始的时间 /// public DateTime ProStartDt { get; set; } /// /// 程序结束的时间 /// public DateTime ProEndDt { get; set; } private string? _ProRunTimeStr; /// /// 程序运行时间字符串 /// public string? ProRunTimeStr { get { return _ProRunTimeStr; } set { _ProRunTimeStr = value; RaisePropertyChanged(); } } /// /// 全部的暂停的时间 /// 可能暂停多次 /// public int PauseTotalSecTime { get; set; } } }