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 = new DispatcherTimer
//{
// Interval = TimeSpan.FromSeconds(1)
//};
//CycleTimer.Tick += (s, e) => CalcTime();
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;
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}秒";
}
///
/// 开始计时
///
public void StartProRunTime()
{
ProStartDt = DateTime.Now;
CycleTimer.Start();
//暂停时间清零,可能是多次开始执行程序,导致PauseTotalSecTime残留到下一个程序计时中
PauseTotalSecTime = 0;
//结束时间信息
EndTimeInfo = ProStartDt.AddSeconds(PauseTotalSecTime).ToString("yyyy-MM-dd HH:mm:ss");
}
///
/// 暂停计时
///
public void PauseProRunTime()
{
//开始暂停的计时
PauseStartDt = DateTime.Now;
CycleTimer.Stop();
}
///
/// 继续计时
/// 返回暂停时间
///
public double ContinueProRunTime()
{
PauseEndDt = DateTime.Now;
//统计的暂停的时间
var PauseTime = (PauseEndDt - PauseStartDt).TotalSeconds;
PauseTotalSecTime = PauseTotalSecTime + (int)Math.Round(PauseTime);
EndTimeInfo = ProStartDt.AddSeconds(PauseTotalSecTime).ToString("yyyy-MM-dd HH:mm:ss");
CycleTimer.Start();
return PauseTime;
}
///
/// 结束计时
///
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; }
///
/// 整个程序步骤的时间长度
///
public long TotalProSec { get; set; }
private double _ProValue;
///
/// 进度数据
///
public double ProValue
{
get { return _ProValue; }
set { _ProValue = value; RaisePropertyChanged(); }
}
private string? _ProRunTimeStr;
///
/// 程序运行时间字符串
///
public string? ProRunTimeStr
{
get { return _ProRunTimeStr; }
set { _ProRunTimeStr = value; RaisePropertyChanged(); }
}
private string _EndTimeInfo;
///
/// 结束时间字符串
///
public string EndTimeInfo
{
get { return _EndTimeInfo; }
set { _EndTimeInfo = value; RaisePropertyChanged(); }
}
///
/// 全部的暂停的时间
/// 可能暂停多次
///
public int PauseTotalSecTime { get; set; }
#region 暂停操作
///
/// 暂停开始时间
///
public DateTime PauseStartDt { get; set; }
///
/// 暂停结束时间
///
public DateTime PauseEndDt { get; set; }
#endregion
}
}