149 lines
4.0 KiB
C#
149 lines
4.0 KiB
C#
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; }
|
||
|
||
|
||
}
|
||
}
|