| | |
| | | communicator.Disconnect(); |
| | | } |
| | | FormClosing -= VisionForm_FormClosing; |
| | | |
| | | //try |
| | | //{ |
| | | // Process[] processes = System.Diagnostics.Process.GetProcesses(); //获得所有进程 |
| | | // foreach (Process p in processes) |
| | | // { |
| | | // if (p.ProcessName == "LB_SmartVision" && p.StartTime < DateTime.Now.AddMilliseconds(-300)) |
| | | // { |
| | | // p.Kill(); |
| | | // } |
| | | // } |
| | | //} |
| | | //catch { } |
| | | |
| | | KillAllTargetProcesses(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 杀进程逻辑 |
| | | /// </summary> |
| | | private void KillAllTargetProcesses() |
| | | { |
| | | try |
| | | { |
| | | // 1. 获取当前进程ID,避免杀死自己 |
| | | int currentProcessId = Process.GetCurrentProcess().Id; |
| | | // 2. 模糊匹配进程名(忽略大小写),覆盖vshost/后缀等情况 |
| | | var targetProcesses = Process.GetProcesses() |
| | | .Where(p => |
| | | p.ProcessName.IndexOf("LB_SmartVision", StringComparison.OrdinalIgnoreCase) >= 0 |
| | | && p.Id == currentProcessId); |
| | | |
| | | foreach (var p in targetProcesses) |
| | | { |
| | | try |
| | | { |
| | | if (!p.HasExited) |
| | | { |
| | | // 先尝试优雅关闭WinForm程序(比直接Kill更友好) |
| | | p.CloseMainWindow(); |
| | | // 等待500ms,看是否正常退出 |
| | | if (!p.WaitForExit(500)) |
| | | { |
| | | p.Kill(); // 强制杀死 |
| | | p.WaitForExit(1000); // 等待进程完全终止 |
| | | } |
| | | } |
| | | p.Dispose(); // 释放进程资源,避免句柄泄漏 |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 记录异常但不中断,比如权限不足的情况 |
| | | System.IO.File.AppendAllText("kill_process_log.txt", $"[{DateTime.Now}] 杀死进程失败: {ex.Message}\r\n"); |
| | | } |
| | | } |
| | | |
| | | // 额外延迟,确保文件句柄完全释放 |
| | | Thread.Sleep(1000); |
| | | } |
| | | catch (Exception) |
| | | { |
| | | // 静默失败,不影响程序退出 |
| | | } |
| | | } |
| | | |
| | | private void btn_Run_Click(object sender, EventArgs e) |
| | | { |
| | | var matchedItems = GlobalVar.dicProcessSetting |
| | | .Where(item => |
| | | { |
| | | var value = item.Value; |
| | | var triggerComm = value["触发通讯"]; |
| | | var triggerChar = value["触发字符"]; |
| | | return triggerComm != null; |
| | | //return triggerComm != null && triggerComm.Equals(name) && |
| | | // (string.IsNullOrEmpty(triggerChar?.ToString()) || |
| | | // msg.StartsWith(triggerChar.ToString())); |
| | | }) |
| | | .ToList(); // 避免重复字典访问和装箱操作 |
| | | if (matchedItems.Count <= 0) |
| | | { |
| | | return; |
| | | } |
| | | TriggerRunMessageReceived(matchedItems[0].Value["触发通讯"], matchedItems[0].Value["触发字符"]); |
| | | } |
| | | |
| | | private void btn_RunContinuously_Click(object sender, EventArgs e) |
| | | { |
| | | if (btn_RunContinuously.Text.Equals("连续运行")) |
| | | { |
| | | btn_RunContinuously.Text = "暂停运行"; |
| | | Task.Factory.StartNew(() => |
| | | { |
| | | var matchedItems = GlobalVar.dicProcessSetting |
| | | .Where(item => |
| | | { |
| | | var value = item.Value; |
| | | var triggerComm = value["触发通讯"]; |
| | | var triggerChar = value["触发字符"]; |
| | | return triggerComm != null; |
| | | //return triggerComm != null && triggerComm.Equals(name) && |
| | | // (string.IsNullOrEmpty(triggerChar?.ToString()) || |
| | | // msg.StartsWith(triggerChar.ToString())); |
| | | }) |
| | | .ToList(); // 避免重复字典访问和装箱操作 |
| | | while (btn_RunContinuously.Text.Equals("暂停运行")) |
| | | { |
| | | |
| | | TriggerRunMessageReceived(matchedItems[0].Value["触发通讯"], matchedItems[0].Value["触发字符"]); |
| | | Thread.Sleep(500); |
| | | } |
| | | //this.Invoke(() => |
| | | //{ |
| | | //}); |
| | | }); |
| | | } |
| | | else if (btn_RunContinuously.Text.Equals("暂停运行")) |
| | | { |
| | | btn_RunContinuously.Text = "连续运行"; |
| | | Thread.Sleep(100); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |