.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));