private void ExcuteCommand(EEGStudioModuleItem eegStudioItem, Guid examinationContext, string fileName, bool isNewExamination, string additionalParams = "", PatientData patientData = null) { if (moduleExchange == null) throw new Exception("Exchange module null reference error !!!"); if (File.Exists(eegStudioItem.ExecuteFile) == false) throw new Exception("EEGStudio executable file not found !!!"); // Проверяем конфиг EEGStudio CheckEEGStudioInitialization(eegStudioItem); // Запуск нового обследования if (isNewExamination == true) { // Создаем файл PatData.dat в папке конфига для обмена данными между базой и EEGStudio // Данные из PatData.dat применяются только при создании нового обследования PatientDataHelper.WriteEEGStudioPatDataFile(patientData, patDataFile, fileName); string newFileParam = string.Format("-new -pat=\"{0}\"", patDataFile); // BeginProcess(eegStudioItem, examinationContext, newFileParam, additionalParams); } else { String file = String.Format("\"{0}\"", fileName); BeginProcess(eegStudioItem, examinationContext, file, additionalParams); } }
// Завершение процесса private void EndProcess(EEGStudioModuleItem eegStudioItem) { if (eegStudioItem != null) { foreach (Guid guid in eegStudioItem.Contexts) { if (CheckOtherUnit(eegStudioItem, guid) == false) moduleExchange.ProcessMessage(guid, "ProcessExited"); } eegStudioItem.Contexts.Clear(); eegStudioItem.Process = null; } }
/// <summary> /// Метод проверяет наличие конфига EEGStudio /// и если его нет запускает EEGStudio с ключем -init для инициализации /// </summary> private void CheckEEGStudioInitialization(EEGStudioModuleItem item) { int tryInitCount = 1; // счетчик попыток инициализации // Если нет конфига EEGStudio - запустить процесс с ключем - init while (CheckEEGConfigPath() == false || Directory.Exists(eegStudioConfigPath) == false) { if (tryInitCount == 0) { // Если не удалось создать конфиг с N-ой попытки throw new Exception("Initialization Error"); } tryInitCount--; try { Process process = new Process(); ProcessStartInfo info = new ProcessStartInfo(item.ExecuteFile); String arg = "-init"; info.Arguments = arg; process.StartInfo = info; // При успешном запуске процесс должен создать конфиг и завершиться process.Start(); process.WaitForExit(); // ждать завешения // повторно инициализируем пути eegStudioConfigPath = GetConfigPath(); patDataFile = Path.Combine(eegStudioConfigPath, "PatData.dat"); } catch { throw new Exception("Software not found"); } } }
// Проверяем не содежат ли другие модули идентификатор данного обследования private bool CheckOtherUnit(EEGStudioModuleItem item, Guid context) { return eegStudioItems.FindAll(i => i.Mode != item.Mode).Any(x => x.Contexts.Contains(context)); }
/// <summary> /// Метод запускает с параметрами процесс соответствующего модуля EEGStudio /// !!! ПОРЯДОК ПАРАМЕТРОВ: -mdbs -exam={GUID} file_name[-new] !!! /// </summary> /// <param name="eegStudioItem"></param> /// <param name="examContext">дентификатор обследования</param> /// <param name="examFile">Полное имя файла MDFX</param> /// <param name="additionalParam">Добавочный параметр из конфига</param> private void BeginProcess(EEGStudioModuleItem eegStudioItem, Guid examContext, string examFile, string additionalParam) { Process process = null; try { process = new Process(); ProcessStartInfo info = new ProcessStartInfo(eegStudioItem.ExecuteFile); String arg = String.Format("-mdbs -exam={0} {1} {2}", examContext, examFile, additionalParam); info.Arguments = arg; process.StartInfo = info; process.EnableRaisingEvents = true; // если модуль еще не запускал процессы if (eegStudioItem.Process == null && eegStudioItem.Contexts.Count == 0) { process.Exited += (o, a) => { EndProcess(eegStudioItem); }; eegStudioItem.Process = process; } process.Start(); moduleExchange.ProcessMessage(examContext, "ProcessStarted"); // добавляем обследование в список запущенных данным процессом if (eegStudioItem.Contexts.Contains(examContext) == false) eegStudioItem.Contexts.Add(examContext); } catch (Exception) { throw new Exception(process.ProcessName + " running error !!!"); } }