.NET 4.x Синхронизация потоков. Модель "Супермаркет" - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, у меня возникла проблема с синхронизацией потоков. само задание звучит так:

Создайте модель системы массового обслуживания. В супермаркете есть 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
проблема заключается в том,что мне нужно сделать так чтобы ограничить потоки с методами Kassa1(),Kassa2() и Kassa3() чтобы количество покупателей в очереди никогда не опускалось меньше нуля (это я сделал), но возникает другая проблема,тогда кассы просто работают по очереди,а надо чтобы покупатель сразу шёл на освободившуюся кассу. помогите пожалуйста

Решение задачи: «.NET 4.x Синхронизация потоков. Модель "Супермаркет"»

textual
Листинг программы
Thread.Sleep(rnd_1.Next(1000, 10000));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы