BlackVetal
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору public partial class Form_ControlWindow : Form { #region Поля /// <summary> /// Максимальное значение для генерации случайного останова процесса имитации конвеера /// </summary> private int maxValueSleep = 10000; /// <summary> /// Максимальное значение для генерации аварийного останова /// </summary> private int maxValueАвария = 100000; /// <summary> /// Предел - когда считается что ситуация аварийная и нужен останов /// </summary> private int PredelАвария = 95000; /// <summary> /// Статус конвеера №1 /// </summary> private Conveer_Status Status1; /// <summary> /// Статус конвеера №2 /// </summary> private Conveer_Status Status2; /// <summary> /// Статус конвеера №3 /// </summary> private Conveer_Status Status3; /// <summary> /// Статус конвеера №4 /// </summary> private Conveer_Status Status4; #endregion #region Конструктор /// <summary> /// Конструктор данного класса /// </summary> public Form_ControlWindow() { InitializeComponent(); } #endregion #region Методы /// <summary> /// Делегат - необходим для создания асинхронных и синхронных потоков /// имитации работы конвеера /// </summary> /// <param name="_status"> Статус конвеера</param> /// <param name="_TextBox">Контрол - куда нужно выводить статус</param> delegate void StartConveerDelegate(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl); /// <summary> /// Метод Запускает конвеер с переданными параметрами. /// В переменной _status - передается ссылка на переменную содержащую статус конвеера /// а в переменной _TextBox - передается контрол - в котором должна выводиться информация /// о состоянии конвеера и смене стадий обработки /// </summary> /// <param name="_status"> Статус конвеера</param> /// <param name="_TextBox">Контрол - куда нужно выводить статус</param> private void StartConveer(Conveer_Status Status, RichTextBox _TextBox, XtraUserControl _userControl) { // создаем объект генератора случайных чисел Random rnd = new Random(); // цикл имитации конвеера - бесконечный while (true) { // получаем текущий статус конвеера int Step = (int)Status; //если статус - последний цикл обработки асбеста, то переходим к первому шагу if (Step == (int)Conveer_Status.Упаковка_Хризотила) Step = (int)Conveer_Status.Загрузка_Руды; else // иначе просто переходим к следующему шагу Step++; // присваиваем новый статус конвеера Status = (Conveer_Status)Step; // вычисляем аварийную ситуацию // для этого генерируем число - которое означает вероятность аварии // затем сравниваем с пределом - который означает допустимое значение // аварийности int авария = rnd.Next(maxValueАвария); if (авария > PredelАвария) { // выводим статус что произошла авария ShowStatus(Conveer_Status.Останов_Авария, _TextBox, _userControl); // приостанавливаем поток Thread.Sleep(rnd.Next(maxValueSleep*3)); } // выводим статус что произошла авария ShowStatus(Status, _TextBox, _userControl); // приостанавливаем поток Thread.Sleep(rnd.Next(maxValueSleep)); } } /// <summary> /// Делегат - необходим для создания синхронных и асинхронных потоков вывода /// статуса конвеера. /// ПО сути дела - это объявление шаблона. /// </summary> /// <param name="_status"> Статус конвеера который нужно вывести</param> /// <param name="_TextBox">Контрол - куда нужно вывести статус</param> delegate void ShowStatusDelegate(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl); /// <summary> /// Метод выводит текущий статус конвеера в соответствующее ему окошко. /// Весь вывод осуществляется асинхронно - если все идет стандартно. Это /// необходимо для того чтобы не тормозить остальные процессы. /// </summary> /// <param name="_status"> Статус конвеера который нужно вывести</param> /// <param name="_TextBox">Контрол - куда нужно вывести статус</param> private void ShowStatus(Conveer_Status _status, RichTextBox _TextBox, XtraUserControl _userControl) { // проверяем - соответствует ли даный контрол текущему потоку if (_TextBox.InvokeRequired == false) { // выводим строку статуса _TextBox.Text += "" + DateTime.Now.ToString() + " -> " + _status + Environment.NewLine; _userControl.SetStep(_status); } else // создаем вывод статуса в синхронном потоке { ShowStatusDelegate _showStatus = new ShowStatusDelegate(ShowStatus); this.BeginInvoke(_showStatus, new object[] { _status, _TextBox, _userControl }); } } #endregion #region События /// <summary> /// Метод Запускает конвеер №1. Сначала запускается инициализация конвера, /// его тестирование. Затем уже не посредственно работа. /// </summary> /// <param name="sender">Источник события - кнопка button_StartConveer1</param> /// <param name="e">Аргументы события</param> private void button_StartConveer1_Click(object sender, EventArgs e) { Status1 = Conveer_Status.Останов; textBox_conveer1.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine; StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer); _startConveer.BeginInvoke(Status1, textBox_conveer1, xtraUserControl1, null, null); } /// <summary> /// Метод Запускает конвеер №2. Сначала запускается инициализация конвера, /// его тестирование. Затем уже не посредственно работа. /// </summary> /// <param name="sender">Источник события - кнопка button_StartConveer2</param> /// <param name="e">Аргументы события</param> private void button__StartConveer2_Click(object sender, EventArgs e) { Status2 = Conveer_Status.Останов; richTextBox_Conveer2.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine; StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer); _startConveer.BeginInvoke(Status2, richTextBox_Conveer2, xtraUserControl2, null, null); } /// <summary> /// Метод Запускает конвеер №3. Сначала запускается инициализация конвера, /// его тестирование. Затем уже не посредственно работа. /// </summary> /// <param name="sender">Источник события - кнопка button_StartConveer3</param> /// <param name="e">Аргументы события</param> private void button__StartConveer3_Click(object sender, EventArgs e) { Status3 = Conveer_Status.Останов; richTextBox_Conveer3.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine; StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer); _startConveer.BeginInvoke(Status3, richTextBox_Conveer3, xtraUserControl3, null, null); } /// <summary> /// Метод Запускает конвеер №4. Сначала запускается инициализация конвера, /// его тестирование. Затем уже не посредственно работа. /// </summary> /// <param name="sender">Источник события - кнопка button_StartConveer4</param> /// <param name="e">Аргументы события</param> private void button_StartConveer4_Click(object sender, EventArgs e) { Status4 = Conveer_Status.Останов; richTextBox_Conveer4.Text += "" + DateTime.Now.ToString() + " -> " + Conveer_Status.Останов + Environment.NewLine; StartConveerDelegate _startConveer = new StartConveerDelegate(StartConveer); _startConveer.BeginInvoke(Status4, richTextBox_Conveer4, xtraUserControl4, null, null); } #endregion } /// <summary> /// Статусы конвеера - стадии обработки и возможные остановы. /// </summary> public enum Conveer_Status { Останов = 0, Загрузка_Руды = 1, Дробление_Руды = 2, Отсев_Волокна = 3, Распущевание_Волокна = 4, Прессовка_Волокна = 5, Упаковка_Хризотила = 6, Останов_Авария = 10 } |