using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; using LeatherApp.Utils; using Models; using OpenCvSharp; using OpenCvSharp.Extensions; namespace LeatherApp.Device { public class PhotoLib : IDisposable { public Action QueueCountEvent;//0/1/2, 数量 public Action WarningEvent; /// /// 结果 /// public Action finishEvent; /// /// 是否打开设备成功 /// public bool IsInit { get; private set; } = false; private Thread t_task1; private List lstTask1 = new List(); //private Thread t_task2; //private List lstTask2 = new List(); public PhotoLib() { } public bool start() { try { IsInit = true; lstTask1.Clear(); t_task1 = new System.Threading.Thread(run1); t_task1.IsBackground = true; t_task1.Start(); //t_task_operation = new System.Threading.Thread(run2); //t_task_operation.IsBackground = true; //t_task_operation.Start(); return true; } catch (Exception ex) { WarningEvent?.Invoke(DateTime.Now,WarningEnum.High, ex.Message); return false; } } public void stop() { if (!IsInit) return; try { IsInit = false; //timer.Elapsed -= Timer_Elapsed; if (t_task1 != null) { bool b = t_task1.Join(5000); if (!b) t_task1.Abort(); t_task1 = null; } //if (t_task_operation != null) //{ // bool b = t_task_operation.Join(5000); // if (!b) t_task_operation.Abort(); // t_task_operation = null; //} lstTask1.Clear(); //lstTask2.Clear(); } catch { } } //推理+打标 private void run1() { while (IsInit) { if (lstTask1.Count < 1) { Thread.Sleep(0); continue; } // var task = pop(); //try //{ if (task != null) { task.finishEvent(task); } //} //catch (Exception ex) //{ // WarningEvent?.Invoke(DateTime.Now,WarningEnum.Low, $"DefectLib task2 err({liStep}):" + ex.Message); // task.isSucceed = false; // task.resultInfo = ex.Message; // callback(task); //} } } private void callback(PhotoTask task) { //返回成功/失败,异步调用 if (task.finishEvent != null || (task.finishEvent = finishEvent) != null) //task.finishEvent.BeginInvoke(result, errInfo, res => task.finishEvent.EndInvoke(res), null); System.Threading.ThreadPool.QueueUserWorkItem(waitCallback, task); } //异步回调 WaitCallback waitCallback = new WaitCallback(o => { var task = (PhotoTask)o; task.finishEvent(task); }); public class PhotoTask { public Records record; public object scanPhotos0; public object scanPhotos1; // /// /// 完成后回调 /// public Action finishEvent; //==结果返回 //public bool isSucceed;//转换是否成功 //public string resultInfo = "";//成功或失败信息 //public long[] stopwatch = new long[5]; } public void add(PhotoTask task) { lock (lstTask1) { lstTask1.Add(task); QueueCountEvent?.BeginInvoke(lstTask1.Count, null, null); } } private PhotoTask pop() { lock (lstTask1) { if (lstTask1.Count < 1) return null; var task = lstTask1[0]; lstTask1.RemoveAt(0); QueueCountEvent?.BeginInvoke(lstTask1.Count, null, null); return task; } } public void Dispose() { stop(); } } }