using LogClass; using MvCameraControl; using System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; using static System.Net.Mime.MediaTypeNames; namespace CCDCountWpf.WpfPage { /// /// MainPage.xaml 的交互逻辑 /// public partial class MainPage : Page { #region 变量与实例 bool IsShow = false; SystemMonitor monitor = new SystemMonitor(); #endregion public MainPage() { InitializeComponent(); StartUpdataShowDataThread(); } /// /// 启动更新显示数据线程 /// private void StartUpdataShowDataThread() { IsShow = true; Bitmap image = null; const int targetMsPerFrame = 100; // 20FPS=50ms Stopwatch renderSW = new Stopwatch(); Task.Run(() => { while (IsShow) { UpdataShuLiShowData(); UpdateMonitorMessage(); renderSW.Restart(); if (MessageBus.mainThreadClass == null) { LOG.log(string.Format("{0}:当前加载相机空", "IdentifyCameraForm-StartShowImageThread")); Thread.Sleep(100); continue; } if (MessageBus.mainThreadClass.HistoryActiveNum > 0) { MessageBus.mainThreadClass.GetShowImage(800, out image); } else { MessageBus.mainThreadClass.GetNullShowImage(4096, 800, out image); Thread.Sleep(100); LOG.log(string.Format("{0}-{1}号相机线程启动异常", "IdentifyCameraForm-StartShowImageThread:", MessageBus.mainThreadClass.ThisCamerNo)); } if (image == null) { LOG.log(string.Format("{0}:获取图片失败", "IdentifyCameraForm-StartShowImageThread")); continue; } System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => { var bitmapImage = ConvertToBitmapImage(image); ShowBox.Source = bitmapImage; })); //进行精准20帧控制 int elapsed = (int)renderSW.ElapsedMilliseconds; if (elapsed < targetMsPerFrame) { Thread.Sleep(targetMsPerFrame - elapsed); } Thread.Sleep(50); } }); } /// /// 停止更新显示数据线程 /// private void StopUpdataShowDataThread() { IsShow = false; } /// /// 更新数粒显示数据 /// private void UpdataShuLiShowData() { if (MessageBus.mainThreadClass == null) return; if (MessageBus.mainThreadClass.ShuLiState) { System.Windows.Application.Current.Dispatcher.Invoke(() => { CamRunStaticLab.Foreground = MessageBus.mainThreadClass.CameraRunStatic == true ? System.Windows.Media.Brushes.Green : System.Windows.Media.Brushes.Red; CamRunStaticLab.Content = MessageBus.mainThreadClass.CameraRunStatic == true ? "运行中" : "未运行"; }); } else { System.Windows.Application.Current.Dispatcher.Invoke(() => { CamRunStaticLab.Foreground = System.Windows.Media.Brushes.Yellow; CamRunStaticLab.Content = "视野遮挡"; }); } System.Windows.Application.Current.Dispatcher.Invoke(() => { AllActiveNumTbx.Text = MessageBus.mainThreadClass.HistoryActiveNum.ToString(); AllOkNumTbx.Text = MessageBus.mainThreadClass.NgHistoryNum.ToString(); AllNgNumTbx.Text = MessageBus.mainThreadClass.OkHistoryNum.ToString(); ShuLiSpeedTbx.Text = MessageBus.mainThreadClass.GetOneSecondActiveNum().ToString(); }); } /// /// 更新监控信息 /// private void UpdateMonitorMessage() { System.Windows.Application.Current.Dispatcher.Invoke(() => { RamMonitorLab.Content = $"可用内存: {monitor.GetAvailableMemory()}MB"; CPUMonitorLab.Content = $"CPU: {monitor.GetCpuUsage().ToString("0.00")}%"; }); } // Bitmap 转 BitmapImage 的辅助方法 private BitmapImage ConvertToBitmapImage(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png); memory.Position = 0; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = memory; bitmapImage.EndInit(); return bitmapImage; } } private void DataClear_Click(object sender, RoutedEventArgs e) { MessageBus.mainThreadClass.ClearHistoryActive(); } private void Page_Loaded(object sender, RoutedEventArgs e) { this.Width = double.NaN; // 等效于 Auto this.Height = double.NaN; } } }