private void StartPlot(TempDirConfig tempDirConfig)
        {
            RunningPlot runningPlot = new RunningPlot()
            {
                InternalId = Guid.NewGuid(),
                TempDir    = tempDirConfig.Path
            };

            //runningPlot.Temp2Path = tempDirConfig.Temp2Path;
            //runningPlot.FinalPath = tempDirConfig.FinalPath;
            runningPlot.LogPath = _config.LogPath;
            //runningPlot.PlotSize = tempDirConfig.PlotSize ??_config.DefaultPlotSize ?? null;
            //runningPlot.Buffer = tempDirConfig.Buffer ??_config.DefaultBuffer ?? null;
            //runningPlot.NumThreads = tempDirConfig.NumThreads ?? _config.DefaultNumThreads ?? null;
            //runningPlot.Buckets = tempDirConfig.Buckets ?? _config.DefaultBuckets ?? null;



            _runningPlots.Add(runningPlot);

            _plotInfos.TryAdd(runningPlot.InternalId, new PlotInfo());

            Thread t = new Thread(new ParameterizedThreadStart(ExecutePlotThread));

            t.Start(runningPlot);

            _threads.Add(runningPlot.InternalId, t);
        }
        private void ExecutePlotThread(object prms)
        {
            RunningPlot runningPlot = (RunningPlot)prms;

            string cmd = @"C:\code\plottracker\src\PlotTracker\MockPlot\bin\Debug\net5.0\MockPlot.exe";

            StringBuilder sbArgs = new StringBuilder();

            sbArgs.Append("plots create ");

            if (runningPlot.PlotSize.HasValue)
            {
                sbArgs.Append($"-k {runningPlot.PlotSize} ");
            }

            if (runningPlot.Buffer.HasValue)
            {
                sbArgs.Append($"-b {runningPlot.Buffer} ");
            }

            if (runningPlot.Buckets.HasValue)
            {
                sbArgs.Append($"-u {runningPlot.Buckets} ");
            }

            if (runningPlot.NumThreads.HasValue)
            {
                sbArgs.Append($"-u {runningPlot.NumThreads} ");
            }

            sbArgs.Append($"-t \"{runningPlot.TempDir}\" ");
            Directory.CreateDirectory(runningPlot.TempDir);

            if (!string.IsNullOrWhiteSpace(runningPlot.Temp2Path))
            {
                sbArgs.Append($"-2 \"{runningPlot.Temp2Path}\" ");
                Directory.CreateDirectory(runningPlot.Temp2Path);
            }

            sbArgs.Append($"-d \"{runningPlot.FinalPath}\" ");
            Directory.CreateDirectory(runningPlot.FinalPath);

            Directory.CreateDirectory(runningPlot.LogPath);

            Process p = new Process();

            p.StartInfo.UseShellExecute        = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName  = cmd;
            p.StartInfo.Arguments = sbArgs.ToString().Trim();

            p.OutputDataReceived += new DataReceivedEventHandler((s, e) =>
            {
                if (string.IsNullOrWhiteSpace(e.Data))
                {
                    return;
                }

                PlotInfo plotInfo;
                _plotInfos.TryGetValue(runningPlot.InternalId, out plotInfo);

                //LogParser.ParseLine(e.Data, ref plotInfo);

                _plotInfos.AddOrUpdate(runningPlot.InternalId, plotInfo, (key, existingVal) =>
                {
                    return(plotInfo);
                });

                if (!string.IsNullOrEmpty(plotInfo.Id))
                {
                    string logFilename = Path.Combine(runningPlot.LogPath, $"{plotInfo.Id}.log");
                    using (StreamWriter writer = new StreamWriter(logFilename, true))
                    {
                        writer.WriteLine(e.Data);
                    }
                }
            });

            p.Start();
            p.BeginOutputReadLine();
            p.WaitForExit();
        }