Files
CapMachine/CapMachine.Wpf/Models/ProRunTimeCalc.cs
Tyrone CT 16eaa230d8 CAN驱动的重构V1
CAN报文的展示和处理
2025-04-30 11:23:01 +08:00

220 lines
5.9 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 = new DispatcherTimer
//{
// Interval = TimeSpan.FromSeconds(1)
//};
//CycleTimer.Tick += (s, e) => CalcTime();
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;
var CurTime = (ProEndDt - ProStartDt).TotalSeconds - PauseTotalSecTime; //计算总时间,单位秒
if (TotalProSec != 0)
{
ProValue = CurTime * 100 / TotalProSec;
}
ProRunTimeStr = ConvertSecToDHMS((int)Math.Round(CurTime));
}
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;
//结束时间信息
EndTimeInfo = ProStartDt.AddSeconds(TotalProSec).ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// 暂停计时
/// </summary>
public void PauseProRunTime()
{
//开始暂停的计时
PauseStartDt = DateTime.Now;
CycleTimer.Stop();
}
/// <summary>
/// 继续计时
/// 返回暂停时间
/// </summary>
public double ContinueProRunTime()
{
PauseEndDt = DateTime.Now;
//统计的暂停的时间
var PauseTime = (PauseEndDt - PauseStartDt).TotalSeconds;
PauseTotalSecTime = PauseTotalSecTime + (int)Math.Round(PauseTime);
EndTimeInfo = ProStartDt.AddSeconds(TotalProSec+ PauseTotalSecTime).ToString("yyyy-MM-dd HH:mm:ss");
CycleTimer.Start();
return PauseTime;
}
/// <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; }
/// <summary>
/// 整个程序步骤的时间长度
/// </summary>
public long TotalProSec { get; set; }
private double _ProValue;
/// <summary>
/// 进度数据
/// </summary>
public double ProValue
{
get { return _ProValue; }
set { _ProValue = value; RaisePropertyChanged(); }
}
private string? _ProRunTimeStr;
/// <summary>
/// 程序运行时间字符串
/// </summary>
public string? ProRunTimeStr
{
get { return _ProRunTimeStr; }
set { _ProRunTimeStr = value; RaisePropertyChanged(); }
}
private string _EndTimeInfo;
/// <summary>
/// 结束时间字符串
/// </summary>
public string EndTimeInfo
{
get { return _EndTimeInfo; }
set { _EndTimeInfo = value; RaisePropertyChanged(); }
}
/// <summary>
/// 全部的暂停的时间
/// 可能暂停多次
/// </summary>
public int PauseTotalSecTime { get; set; }
#region
/// <summary>
/// 暂停开始时间
/// </summary>
public DateTime PauseStartDt { get; set; }
/// <summary>
/// 暂停结束时间
/// </summary>
public DateTime PauseEndDt { get; set; }
#endregion
}
}