Бегущие кнопки в потоке - исправить код - C#

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

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

Есть листинг программы и форма, на форме 3 кнопки, которые в случайном порядке перемещаются по оси х и 3 кнопки управления, старт, стоп и пауза. Кто может подсказать, почему у меня при нажатии на кнопку старт не перемещаются кнопки.
Листинг программы
  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 WindowsFormsApplication3
  11. {
  12. public delegate void HelperToCall(Button btn);//ПОмошник для манипулирования объектами из разных потоков, тк
  13. //объкты созданные в одном вотоке не могут использоваться в других, поетому исп делегаты тк они асинхронны
  14.  
  15. public partial class Form1 : Form
  16. {
  17. Thread t1;//Поток для движения первой кнопки
  18. Thread t2;//-=-
  19. Thread t3;//-=-
  20. HelperToCall helper;
  21. Random r;// отвечает за произвольную скорость движения кнопок
  22. public Form1()
  23. {
  24. InitializeComponent();
  25. HelperToCall helper = new HelperToCall(Motion);
  26. r=new Random();
  27. }
  28. private void Form1_Load(object sender, EventArgs e)
  29. {
  30. }
  31. private void Start_btn_Click(object sender, EventArgs e)
  32. {
  33. ((Button)sender).Enabled=false;
  34. if (t1 != null)
  35. { t1.Resume();
  36. t2.Resume();
  37. t3.Resume();
  38. return;
  39. }
  40. t1 = new Thread(Movement1);
  41. t2 = new Thread(Movement2);
  42. t3 = new Thread(Movement3);
  43. t1.IsBackground = t2.IsBackground = t3.IsBackground = true;
  44. t1.Start();
  45. t2.Start();
  46. t3.Start();
  47. }
  48.  
  49. void Motion(Button button)
  50. {
  51. button.Location = new Point(button.Location.X + r.Next(0,10), button.Location.Y);
  52. }
  53. void Movement1()
  54. {
  55. while (true)
  56. {
  57. Thread.Sleep(r.Next(5,40));
  58. Invoke(helper,First_btn);//Инвок, метод, влезающий в другие потоки
  59. }
  60. }
  61. void Movement2()
  62. {
  63. while (true)
  64. {
  65. Thread.Sleep(r.Next(5,40));
  66. Invoke(helper, Second_btn);
  67. }
  68. }
  69. void Movement3()
  70. {
  71. while (true)
  72. {
  73. Thread.Sleep(r.Next(5,40));
  74. Invoke(helper, Third_btn);
  75. }
  76. }
  77. private void Pause_btn_Click(object sender, EventArgs e)
  78. {
  79. Start_btn.Enabled = true;
  80. if (t1 != null)
  81. {
  82. t1.Suspend();
  83. t2.Suspend();
  84. t3.Suspend();
  85. }
  86.  
  87. }
  88. private void Stop_btn_Click(object sender, EventArgs e)
  89. {
  90. Pause_btn_Click(sender, e);
  91.  
  92. }
  93.  
  94. private void Reset()
  95. {
  96. First_btn.Location = new Point(13, First_btn.Location.Y);
  97. Second_btn.Location = new Point(13, Second_btn.Location.Y);
  98. Third_btn.Location = new Point(13, Third_btn.Location.Y);
  99. }
  100. }
  101. }

Решение задачи: «Бегущие кнопки в потоке - исправить код»

textual
Листинг программы
  1. public Form1()
  2.         {
  3.             InitializeComponent();
  4.              r=new Random();
  5. //уникальный метод для  любого потока
  6.             ParameterizedThreadStart thFunc = x =>
  7.             {
  8.                 Control c = x as Control;
  9.                 while (true)
  10.                 {
  11.                     c.Invoke(new Action<Control>(btn =>
  12.                     {
  13.                         btn.Location = new Point(r.Next(20, 400), (btn as Control).Location.Y);
  14.                     }), c);
  15.                 }
  16.             };
  17. //инициализируем потоки только один!! раз
  18.             t1=new Thread(thFunc);
  19.             t2=new Thread(thFunc);
  20.             t3=new Thread(thFunc);
  21.         }
  22.  private void Start_btn_Click(object sender, EventArgs e)
  23.         {
  24.                 ((Button)sender).Enabled=false;
  25.               Pause_btn.Enabled=true;
  26. //запускаем поток, передам ему кнопку
  27.                 t1.Start(First_btn);
  28.                 t2.Start(Second_btn);
  29.                 t3.Start(Third_btn);            
  30.         }
  31. private void Stop_btn_Click(object sender, EventArgs e)
  32.      {
  33. //есть специальная ф-ция для остановки потока
  34.          t1.Abort();
  35.          t2.Abort();
  36.          t3.Abort();
  37.          Start_btn.Enabled =true;
  38.          Pause_btn.Enabled=false;
  39.      }
  40.  
  41. private void Pause_btn_Click(object sender, EventArgs e)
  42.      {
  43. //тут убирается ставшая лишней проверка
  44.              t1.Suspend();
  45.              t2.Suspend();
  46.              t3.Suspend();
  47.      }

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


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

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

11   голосов , оценка 3.818 из 5

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

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

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