.NET 4.x Синхронизация потоков. Модель "Супермаркет" - C#
Формулировка задачи:
Здравствуйте, у меня возникла проблема с синхронизацией потоков. само задание звучит так:
архив с исходником:
проблема заключается в том,что мне нужно сделать так чтобы ограничить потоки с методами Kassa1(),Kassa2() и Kassa3() чтобы количество покупателей в очереди никогда не опускалось меньше нуля (это я сделал), но возникает другая проблема,тогда кассы просто работают по очереди,а надо чтобы покупатель сразу шёл на освободившуюся кассу. помогите пожалуйста
Создайте модель системы массового обслуживания. В супермаркете есть 3 кассы. Каждая касса может обслуживать только одного покупателя в любой момент времени. К кассам подходят покупатели с интервалом времени от 3 до 5 минут. Время обслуживания на кассе – от 1 до 10 минут. Покупатель выбирает первую освободившуюся кассу. На форме необходимо отобразить элементы, изображающие каждую кассу и очередь перед кассами. В очереди должна отображаться ее длина в текущий момент времени. Кроме того, должно отображаться общее число обслуженных покупателей.
вот мой код:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace _6 { public partial class Form1 : Form { uint max_ochered; int ludy_v_ocheredy, vsego_obsluzheno; delegate void Ochered(object name); Thread thread; Thread thread1; Thread thread2; Thread thread3; public Form1() { InitializeComponent(); } private void Start_Click(object sender, EventArgs e) { try { max_ochered = uint.Parse(textBoxMax.Text); } catch { if (max_ochered <= 0) { MessageBox.Show("Ошибка", "Число должно быть положительным"); } textBoxMax.Clear(); } textBoxMax.Enabled = false; thread = new Thread(noviy_klient); thread.Start(); thread1 = new Thread(Kassa1); thread1.Start(); thread2 = new Thread(Kassa2); thread2.Start(); thread3 = new Thread(Kassa3); thread3.Start(); Start.Enabled = false; } private void Stop_Click(object sender, EventArgs e) { thread.Abort(); thread1.Abort(); thread2.Abort(); thread3.Abort(); Stop.Enabled = false; } public void pokaz_Ocheredy(object ochered) { labelQueue.Text = Convert.ToString(ochered); } public void pokaz_statusa_kassy_1(object ochered1) { busyness1.Text = Convert.ToString(ochered1); } public void pokaz_statusa_kassy_2(object ochered2) { busyness2.Text = Convert.ToString(ochered2); } public void pokaz_statusa_kassy_3(object ochered3) { busyness3.Text = Convert.ToString(ochered3); } public void obsluzheno_vsego_chelovek(object vsego) { labelCatered.Text = vsego_obsluzheno.ToString(); } public void noviy_klient() { for (int i = 0; i < max_ochered; i++) { Random rnd = new Random(); Thread.Sleep(rnd.Next(3000, 5000)); ludy_v_ocheredy += 1; Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy); } } public void Kassa1() { while (true) { lock (thread) { if (ludy_v_ocheredy > 0) { Random rnd_1 = new Random(); Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса занята"); ludy_v_ocheredy -= 1; Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy); Thread.Sleep(rnd_1.Next(1000, 10000)); Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++); Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса свободна"); } } } } public void Kassa2() { while (true) { lock (thread) { if (ludy_v_ocheredy > 0) { Random rnd_1 = new Random(); Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса занята"); ludy_v_ocheredy -= 1; Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy); Thread.Sleep(rnd_1.Next(1000, 10000)); Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++); Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса свободна"); } } } } public void Kassa3() { while (true) { lock (thread) { if (ludy_v_ocheredy > 0) { Random rnd_1 = new Random(); Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса занята"); ludy_v_ocheredy -= 1; Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy); Thread.Sleep(rnd_1.Next(1000, 10000)); Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++); Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса свободна"); } } } } } }
6.rar
Решение задачи: «.NET 4.x Синхронизация потоков. Модель "Супермаркет"»
textual
Листинг программы
Thread.Sleep(rnd_1.Next(1000, 10000));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д