Files
CapMachine/CapMachine.Wpf/Models/ProRunTimeCalc.cs
2025-04-17 09:26:54 +08:00

149 lines
4.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// 程序运行时间统计
/// </summary>
public class ProRunTimeCalc : BindableBase
{
public ProRunTimeCalc()
{
//秒触发一次
CycleTimer = new System.Timers.Timer(1000);
CycleTimer.Elapsed += ProRunCycleAction;
CycleTimer.AutoReset = true;
CycleTimer.Enabled = true;
}
/// <summary>
/// 程序运行时间周期统计
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void ProRunCycleAction(object? sender, ElapsedEventArgs e)
{
CycleTimer.Stop();
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
CalcTime();
}));
CycleTimer.Start();
}
/// <summary>
/// 统计时间
/// </summary>
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}秒";
}
/// <summary>
/// 开始计时
/// </summary>
public void StartProRunTime()
{
ProStartDt = DateTime.Now;
CycleTimer.Start();
//暂停时间清零可能是多次开始执行程序导致PauseTotalSecTime残留到下一个程序计时中
PauseTotalSecTime = 0;
}
/// <summary>
/// 暂停计时
/// </summary>
public void PauseProRunTime()
{
CycleTimer.Stop();
}
/// <summary>
/// 继续计时
/// </summary>
public void ContinueProRunTime()
{
CycleTimer.Start();
}
/// <summary>
/// 结束计时
/// </summary>
public void EndProRunTime()
{
CycleTimer.Stop();
CalcTime();
//暂停时间清零可能是多次开始执行程序导致PauseTotalSecTime残留到下一个程序计时中
PauseTotalSecTime = 0;
}
/// <summary>
/// 周期定时器
/// </summary>
private System.Timers.Timer CycleTimer { get; set; }
/// <summary>
/// 程序开始的时间
/// </summary>
public DateTime ProStartDt { get; set; }
/// <summary>
/// 程序结束的时间
/// </summary>
public DateTime ProEndDt { get; set; }
private string? _ProRunTimeStr;
/// <summary>
/// 程序运行时间字符串
/// </summary>
public string? ProRunTimeStr
{
get { return _ProRunTimeStr; }
set { _ProRunTimeStr = value; RaisePropertyChanged(); }
}
/// <summary>
/// 全部的暂停的时间
/// 可能暂停多次
/// </summary>
public int PauseTotalSecTime { get; set; }
}
}