Многопоточное приложение: проблема с параллельностью выполнения потоков - C#

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

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

Здравствуйте,прошу помощи у вас по следующему вопросу. у меня есть многопоточное приложение, но проблема в том, что почему-то потоки thread1,thread2,thread3 работают не параллельно. не могу разобраться с данной проблемой полный код программы:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. namespace _6
  11. {
  12. public partial class Form1 : Form
  13. {
  14. uint max_ochered;
  15. int ludy_v_ocheredy, vsego_obsluzheno;
  16. delegate void Ochered(object name);
  17.  
  18. Thread thread;
  19. Thread thread1;
  20. Thread thread2;
  21. Thread thread3;
  22. public Form1()
  23. {
  24. InitializeComponent();
  25. }
  26. private void Start_Click(object sender, EventArgs e)
  27. {
  28. try
  29. {
  30. max_ochered = uint.Parse(textBoxMax.Text);
  31. }
  32. catch
  33. {
  34. if (max_ochered <= 0)
  35. {
  36. MessageBox.Show("Ошибка", "Число должно быть положительным");
  37. }
  38. textBoxMax.Clear();
  39. }
  40. textBoxMax.Enabled = false;
  41. thread = new Thread(noviy_klient);
  42. thread.Start();
  43.  
  44. thread1 = new Thread(Kassa1);
  45. thread1.Start();
  46.  
  47. thread2 = new Thread(Kassa2);
  48. thread2.Start();
  49.  
  50. thread3 = new Thread(Kassa3);
  51. thread3.Start();
  52. Start.Enabled = false;
  53. }
  54. private void Stop_Click(object sender, EventArgs e)
  55. {
  56. thread.Abort();
  57. thread1.Abort();
  58. thread2.Abort();
  59. thread3.Abort();
  60. Stop.Enabled = false;
  61. }
  62. public void pokaz_Ocheredy(object ochered)
  63. {
  64. labelQueue.Text = Convert.ToString(ochered);
  65. }
  66. public void pokaz_statusa_kassy_1(object ochered1)
  67. {
  68. busyness1.Text = Convert.ToString(ochered1);
  69. }
  70. public void pokaz_statusa_kassy_2(object ochered2)
  71. {
  72. busyness2.Text = Convert.ToString(ochered2);
  73. }
  74. public void pokaz_statusa_kassy_3(object ochered3)
  75. {
  76. busyness3.Text = Convert.ToString(ochered3);
  77. }
  78. public void obsluzheno_vsego_chelovek(object vsego)
  79. {
  80. labelCatered.Text = vsego_obsluzheno.ToString();
  81. }
  82. public void noviy_klient()
  83. {
  84. for (int i = 0; i < max_ochered; i++)
  85. {
  86. Random rnd = new Random();
  87. Thread.Sleep(rnd.Next(3000, 5000));
  88. ludy_v_ocheredy += 1;
  89. Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy);
  90. }
  91. }
  92. public void Kassa1()
  93. {
  94. while (true)
  95. {
  96. lock (thread)
  97. {
  98. if (ludy_v_ocheredy > 0)
  99. {
  100. Random rnd_1 = new Random();
  101. Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса занята");
  102. ludy_v_ocheredy -= 1;
  103. Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy);
  104. Monitor.Wait(thread, rnd_1.Next(1000, 10000));
  105. Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  106. Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса свободна");
  107. }
  108. }
  109. }
  110. }
  111. public void Kassa2()
  112. {
  113. while (true)
  114. {
  115. lock (thread)
  116. {
  117. if (ludy_v_ocheredy > 0)
  118. {
  119. Random rnd_1 = new Random();
  120. Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса занята");
  121. ludy_v_ocheredy -= 1;
  122. Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy);
  123. Monitor.Wait(thread, rnd_1.Next(1000, 10000));
  124. Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  125. Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса свободна");
  126. }
  127. }
  128. }
  129. }
  130. public void Kassa3()
  131. {
  132. while (true)
  133. {
  134. lock (thread)
  135. {
  136. if (ludy_v_ocheredy > 0)
  137. {
  138. Random rnd_1 = new Random();
  139. Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса занята");
  140. ludy_v_ocheredy -= 1;
  141. Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy);
  142. Monitor.Wait(thread, rnd_1.Next(1000, 10000));
  143. Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  144. Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса свободна");
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
Архив с программой:
6.rar
помогите пожалуйста

Решение задачи: «Многопоточное приложение: проблема с параллельностью выполнения потоков»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10.  
  11. namespace _6
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         uint max_ochered;
  16.         int ludy_v_ocheredy, vsego_obsluzheno;
  17.         delegate void Ochered(object name);
  18.  
  19.         Thread thread;
  20.         Thread thread1;
  21.         Thread thread2;
  22.         Thread thread3;
  23.  
  24.         Mutex mx = new Mutex();
  25.  
  26.         public Form1()
  27.         {
  28.             InitializeComponent();
  29.         }
  30.  
  31.         private void Start_Click(object sender, EventArgs e)
  32.         {
  33.             try
  34.             {
  35.                 max_ochered = uint.Parse(textBoxMax.Text);
  36.             }
  37.             catch
  38.             {
  39.                 if (max_ochered <= 0)
  40.                 {
  41.                     MessageBox.Show("Ошибка", "Число должно быть положительным");
  42.                 }
  43.                 textBoxMax.Clear();
  44.             }
  45.            
  46.             textBoxMax.Enabled = false;
  47.  
  48.             thread = new Thread(noviy_klient);
  49.             thread.Start();
  50.  
  51.  
  52.             thread1 = new Thread(Kassa1);
  53.             thread1.Start();
  54.  
  55.  
  56.             thread2 = new Thread(Kassa2);
  57.             thread2.Start();
  58.  
  59.  
  60.             thread3 = new Thread(Kassa3);
  61.             thread3.Start();
  62.  
  63.             Start.Enabled = false;
  64.         }
  65.  
  66.         private void Stop_Click(object sender, EventArgs e)
  67.         {
  68.             thread.Abort();
  69.             thread1.Abort();
  70.             thread2.Abort();
  71.             thread3.Abort();
  72.             Stop.Enabled = false;
  73.         }
  74.  
  75.         public void pokaz_Ocheredy(object ochered)
  76.         {
  77.             labelQueue.Text = Convert.ToString(ochered);
  78.         }
  79.  
  80.         public void pokaz_statusa_kassy_1(object ochered1)
  81.         {
  82.             busyness1.Text = Convert.ToString(ochered1);
  83.         }
  84.  
  85.         public void pokaz_statusa_kassy_2(object ochered2)
  86.         {
  87.             busyness2.Text = Convert.ToString(ochered2);
  88.         }
  89.  
  90.         public void pokaz_statusa_kassy_3(object ochered3)
  91.         {
  92.             busyness3.Text = Convert.ToString(ochered3);
  93.         }
  94.  
  95.         public void obsluzheno_vsego_chelovek(object vsego)
  96.         {
  97.             labelCatered.Text = vsego_obsluzheno.ToString();
  98.         }
  99.  
  100.         public void noviy_klient()
  101.         {
  102.                 for (int i = 0; i < max_ochered; i++)
  103.                 {
  104.                     Random rnd = new Random();
  105.                     Thread.Sleep(rnd.Next(3000, 5000));
  106.            
  107.                         ludy_v_ocheredy += 1;
  108.                         Invoke(new Ochered(pokaz_Ocheredy), ludy_v_ocheredy);
  109.                 }
  110.         }
  111.  
  112.         bool GetClient()
  113.         {
  114.             lock (thread)
  115.             {
  116.                 if (ludy_v_ocheredy > 0)
  117.                 {
  118.                     ludy_v_ocheredy -= 1; return true;
  119.                 } return false;
  120.             }
  121.         }
  122.  
  123.         public void Kassa1()
  124.         {
  125.             while (true)
  126.             {
  127.                 if (GetClient())
  128.                 {
  129.                     Random rnd_1 = new Random();
  130.                     Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса занята");
  131.                     Thread.Sleep(rnd_1.Next(1000, 10000));
  132.                     Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  133.                     Invoke(new Ochered(pokaz_statusa_kassy_1), "Касса свободна");
  134.                 }
  135.             }
  136.         }
  137.  
  138.         public void Kassa2()
  139.         {
  140.             while (true)
  141.             {
  142.                 if (GetClient())
  143.                 {
  144.                     Random rnd_1 = new Random();
  145.                     Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса занята");
  146.                     Thread.Sleep(rnd_1.Next(1000, 10000));
  147.                     Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  148.                     Invoke(new Ochered(pokaz_statusa_kassy_2), "Касса свободна");
  149.                 }
  150.             }
  151.         }
  152.  
  153.         public void Kassa3()
  154.         {
  155.             while (true)
  156.             {
  157.                 if (GetClient())
  158.                 {
  159.                     Random rnd_1 = new Random();
  160.                     Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса занята");
  161.                     Thread.Sleep(rnd_1.Next(1000, 10000));
  162.                     Invoke(new Ochered(obsluzheno_vsego_chelovek), vsego_obsluzheno++);
  163.                     Invoke(new Ochered(pokaz_statusa_kassy_3), "Касса свободна");
  164.                 }
  165.             }
  166.         }
  167.     }
  168. }

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


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

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

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы