Example #1
0
        private void ThreadRegistration(Object obj)
        {
            InfectiousDepartmentForm form = (InfectiousDepartmentForm)obj;
            String str;

            //  Сигнализируем о начале работы регистратуры
            str = "Регистратура начала работу в " + DateTime.Now.ToString() + "\n";
            form.Invoke(form.ToProtocolDelegate, new Object[] { str });


            Random random = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);

            //  Выполняем, пока не получена команда завершения
            while (!form._stop)
            {
                int  delay      = Convert.ToInt32(random.NextDouble() * 1000 * form._maxRegistrationTime);
                bool isInfected = (delay % 2 == 0) ? false : true;


                Patient patient = new Patient(this, isInfected);


                str = "---- Поступил " + ((isInfected) ? "инфицированный" : "здоровый") + " пациент " + patient.Number.ToString() +
                      " в " + DateTime.Now.ToString() + "\n";
                form.Invoke(form.ToProtocolDelegate, new Object[] { str });

                //  И помещаем пациента в общую очередь
                lock (form._registrationQueue)
                {
                    form._registrationQueue.Add(patient);

                    //  Если пациент инфицирован, увеличим счетчик
                    if (patient.IsInfected)
                    {
                        form._infected++;
                    }
                }
                form.Invoke(PatientEntryRegistration, new Object[] { patient });

                //  Ждем следующего пациента
                Thread.Sleep(delay);
            }

            //  Сигнализируем о завершении работы регистратуры
            str = "Регистратура закончила работу в " + DateTime.Now.ToString() + "\n";
            form.Invoke(form.ToProtocolDelegate, new Object[] { str });

            //  Удаляем ссылку на поток из списка
            form.Invoke(form.RemoveCompletedThread, new Object[] { form._registrationThread });
        }
Example #2
0
 public Doctor(InfectiousDepartmentForm form)
 {
     _form   = form;
     _number = ++form._doctorNumber;
 }
Example #3
0
        private void ThreadObservationRoom(Object obj)
        {
            InfectiousDepartmentForm form = (InfectiousDepartmentForm)obj;
            Patient patient;
            String  str;
            bool    isInfected = false;
            bool    isExit     = false;

            //  Сигнализируем о начале работы смотровой комнаты
            str = "Смотровая комната начала работу в " + DateTime.Now.ToString() + "\n";
            form.Invoke(form.ToProtocolDelegate, new Object[] { str });

            //  Основной цикл потока
            while (!isExit)
            {
                lock (form._registrationQueue)
                {
                    lock (form._observationRoomQueue)
                    {
                        //  Если нужно завершить работу, завершим
                        if (form._stop && form._registrationQueue.Count == 0 && form._observationRoomQueue.Count == 0)
                        {
                            isExit = true;
                        }
                        else
                        {
                            //  Если очередь регистратуры не пуста
                            if (form._registrationQueue.Count != 0)
                            {
                                //  Помещаем пациентов в смотровую комнату
                                if (form._observationRoomQueue.Count == 0)
                                {
                                    //  Определяем, здоровых или инфицированных пациентов будем принимать по первому в очереди
                                    patient = form._registrationQueue[0];

                                    //  Блокируем доступ к объекту пациента
                                    lock (patient)
                                    {
                                        form._registrationQueue.Remove(patient);
                                        isInfected = patient.IsInfected;

                                        //  Если пациент инфицирован, уменьшим счетчик
                                        if (patient.IsInfected)
                                        {
                                            form._infected--;
                                        }

                                        //  Пациент перемещается в смотровую комнату
                                        form.Invoke(PatientEntryObservationRoom, new Object[] { patient });
                                        form._observationRoomQueue.Add(patient);


                                        str = "---- Пациент " + patient.Number.ToString() + " перешел в смотровую комнату в " +
                                              DateTime.Now.ToString() + "\n";
                                        form.Invoke(form.ToProtocolDelegate, new Object[] { str });
                                    }
                                }

                                //  Добавляем либо здоровых либо инфицированных пациентов, в зависимости от того,
                                //  какие уже есть в очереди
                                int i = 0;
                                while (form._observationRoomQueue.Count < form._observationRoomCapacity)
                                {
                                    //  Если в очереди регистратуры нет таких пациентов, выйдем из цикла
                                    if (i == form._registrationQueue.Count)
                                    {
                                        break;
                                    }

                                    //  Смотрим, что за пациент в очереди
                                    patient = form._registrationQueue[i];


                                    lock (patient)
                                    {
                                        if (patient.IsInfected == isInfected)
                                        {
                                            form._registrationQueue.Remove(patient);

                                            //  Если пациент инфицирован, уменьшим счетчик
                                            if (patient.IsInfected)
                                            {
                                                form._infected--;
                                            }

                                            //  Пациент перемещается в смотровую комнату
                                            form.Invoke(PatientEntryObservationRoom, new Object[] { patient });
                                            form._observationRoomQueue.Add(patient);


                                            str = "---- Пациент " + patient.Number.ToString() + " перешел в смотровую комнату в " +
                                                  DateTime.Now.ToString() + "\n";
                                            form.Invoke(form.ToProtocolDelegate, new Object[] { str });
                                        }
                                        else
                                        {
                                            //  Увеличим номер пациента в очереди
                                            i++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                //  Если нет команды завершить работу
                if (!isExit)
                {
                    //  Ждем новых пацинтов
                    Thread.Sleep(1000);
                }
            }


            str = "Смотровая комната закончила работу в " + DateTime.Now.ToString() + "\n";
            form.Invoke(form.ToProtocolDelegate, new Object[] { str });

            //  Удаляем ссылку на поток из списка
            form.Invoke(form.RemoveCompletedThread, new Object[] { form._observationRoomThread });
        }
Example #4
0
        static void Main()
        {
            InfectiousDepartmentForm form = new InfectiousDepartmentForm();

            form.ShowDialog();
        }
Example #5
0
 public Patient(InfectiousDepartmentForm form, bool infected)
 {
     _form     = form;
     _infected = infected;
     _number   = ++form._patientNumber;
 }