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 }); }
public Doctor(InfectiousDepartmentForm form) { _form = form; _number = ++form._doctorNumber; }
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 }); }
static void Main() { InfectiousDepartmentForm form = new InfectiousDepartmentForm(); form.ShowDialog(); }
public Patient(InfectiousDepartmentForm form, bool infected) { _form = form; _infected = infected; _number = ++form._patientNumber; }