using DevExpress.Pdf; using Ips.Library.Basic; using Ips.Library.Entity; using Ips.Library.Signals; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Service.GpuServer { /// /// 参估处理服务 /// public class CgService { private bool isBusy = false; private string exeName = "cog"; /// /// 开始 /// /// /// public async Task StartAsync(CorParams dto) { if (isBusy) { throw new Exception("上次GPU调用未结束"); } //直接从采集上下载文件到本地 string[] files = new string[] { dto.File1, dto.File2 }; for (int i = 0; i < 2; i++) { string localFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Download", files[i]); if (!File.Exists(localFile)) { var res = await HttpHelper.DownloadFileAsync(dto.AdFileDownloadUrl, files[i], localFile); if (!res) { throw new Exception($"文件下载失败,url=[{dto.AdFileDownloadUrl}?filename={files[i]}]"); } } if (i == 0) dto.File1 = localFile; else dto.File2 = localFile; } return await Task.Run(() => { try { isBusy = true; Process p = new Process(); p.StartInfo.FileName = $"参数估计\\{exeName}.exe"; StringBuilder sb = new StringBuilder(); sb.Append($"{dto.File1} "); sb.Append($"{dto.File2} "); sb.Append($"{dto.DtoCenter} "); sb.Append($"{dto.DtoRange} "); sb.Append($"{dto.Snr} "); sb.Append($"{dto.DfoRange} "); sb.Append($"{dto.DtoCorr} "); sb.Append($"{dto.DfoCorr} "); sb.Append($"{dto.Fs} "); sb.Append($"-l {dto.DataLen} "); sb.Append($"-z {dto.AddZero} "); sb.Append($"-o {dto.TimeOffset} "); sb.Append($"-f {(int)dto.OffsetType} "); if (dto.Timeslots != null) { sb.Append($"-d {string.Join(" ", dto.Timeslots)} "); sb.Append($"-m {dto.MergeType.ToString("d")}"); } p.StartInfo.Arguments = sb.ToString(); p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; IpsLogger.Info($"开始参估计算.可打开Logs目录查看{exeName}.exe命令行参数详细"); IpsLogger.Info($"开始参估计算.{exeName}.exe参数={p.StartInfo.Arguments}",false); p.Start(); var succeed = p.WaitForExit(30 * 1000); if (!succeed) { Stop(); throw new Exception($"计算超时"); } var err = p.StandardError.ReadToEnd(); if (!string.IsNullOrWhiteSpace(err)) { throw new Exception(err); } var str = p.StandardOutput.ReadToEnd(); var result = CorResult.FromLines(str, dto.Snr); return result; } finally { isBusy = false; } }); } /// /// 停止 /// public void Stop() { var pros = Process.GetProcessesByName(exeName); foreach (var item in pros) { try { item.Kill(); } catch { } } } private CorResult[] FromLines(string result, double snr) { if (string.IsNullOrWhiteSpace(result)) return new CorResult[0]; var lines = result.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries); CorResult[] results = new CorResult[lines.Length]; for (int i = 0; i < lines.Length; i++) { results[i] = FromLine(lines[i], snr); } return results; } private CorResult FromLine(string line, double snr) { if (string.IsNullOrWhiteSpace(line)) throw new ArgumentNullException(nameof(line)); CorResult corResult = new CorResult(); var cafItems = line.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); corResult.Message = line; if (cafItems.Length == 0) return corResult; int i = 0; var cafitem = cafItems[i]; var resitems = cafitem.Split(','); if (resitems.Length != 6) return corResult; corResult.Start = int.Parse(resitems[0]); corResult.Length = int.Parse(resitems[1]); corResult.Dto = double.Parse(resitems[2]); corResult.Dfo = double.Parse(resitems[3]); corResult.Snr = double.Parse(resitems[4]); corResult.UseTime = double.Parse(resitems[5]); corResult.IsValid = corResult.Snr > snr; if (cafItems.Length > 1) { for (i = 1; i < cafItems.Length; i++) { resitems = cafItems[i].Split(','); XgfItem xgfItem = new XgfItem() { Dto = double.Parse(resitems[0]), Dfo = double.Parse(resitems[1]), Snr = double.Parse(resitems[2]) }; corResult.XgfList.Add(xgfItem); } } return corResult; } } }