Бегущие кнопки в потоке - исправить код - C#
Формулировка задачи:
Есть листинг программы и форма, на форме 3 кнопки, которые в случайном порядке перемещаются по оси х и 3 кнопки управления, старт, стоп и пауза. Кто может подсказать, почему у меня при нажатии на кнопку старт не перемещаются кнопки.
Листинг программы
- 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 WindowsFormsApplication3
- {
- public delegate void HelperToCall(Button btn);//ПОмошник для манипулирования объектами из разных потоков, тк
- //объкты созданные в одном вотоке не могут использоваться в других, поетому исп делегаты тк они асинхронны
- public partial class Form1 : Form
- {
- Thread t1;//Поток для движения первой кнопки
- Thread t2;//-=-
- Thread t3;//-=-
- HelperToCall helper;
- Random r;// отвечает за произвольную скорость движения кнопок
- public Form1()
- {
- InitializeComponent();
- HelperToCall helper = new HelperToCall(Motion);
- r=new Random();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- private void Start_btn_Click(object sender, EventArgs e)
- {
- ((Button)sender).Enabled=false;
- if (t1 != null)
- { t1.Resume();
- t2.Resume();
- t3.Resume();
- return;
- }
- t1 = new Thread(Movement1);
- t2 = new Thread(Movement2);
- t3 = new Thread(Movement3);
- t1.IsBackground = t2.IsBackground = t3.IsBackground = true;
- t1.Start();
- t2.Start();
- t3.Start();
- }
- void Motion(Button button)
- {
- button.Location = new Point(button.Location.X + r.Next(0,10), button.Location.Y);
- }
- void Movement1()
- {
- while (true)
- {
- Thread.Sleep(r.Next(5,40));
- Invoke(helper,First_btn);//Инвок, метод, влезающий в другие потоки
- }
- }
- void Movement2()
- {
- while (true)
- {
- Thread.Sleep(r.Next(5,40));
- Invoke(helper, Second_btn);
- }
- }
- void Movement3()
- {
- while (true)
- {
- Thread.Sleep(r.Next(5,40));
- Invoke(helper, Third_btn);
- }
- }
- private void Pause_btn_Click(object sender, EventArgs e)
- {
- Start_btn.Enabled = true;
- if (t1 != null)
- {
- t1.Suspend();
- t2.Suspend();
- t3.Suspend();
- }
- }
- private void Stop_btn_Click(object sender, EventArgs e)
- {
- Pause_btn_Click(sender, e);
- }
- private void Reset()
- {
- First_btn.Location = new Point(13, First_btn.Location.Y);
- Second_btn.Location = new Point(13, Second_btn.Location.Y);
- Third_btn.Location = new Point(13, Third_btn.Location.Y);
- }
- }
- }
Решение задачи: «Бегущие кнопки в потоке - исправить код»
textual
Листинг программы
- public Form1()
- {
- InitializeComponent();
- r=new Random();
- //уникальный метод для любого потока
- ParameterizedThreadStart thFunc = x =>
- {
- Control c = x as Control;
- while (true)
- {
- c.Invoke(new Action<Control>(btn =>
- {
- btn.Location = new Point(r.Next(20, 400), (btn as Control).Location.Y);
- }), c);
- }
- };
- //инициализируем потоки только один!! раз
- t1=new Thread(thFunc);
- t2=new Thread(thFunc);
- t3=new Thread(thFunc);
- }
- private void Start_btn_Click(object sender, EventArgs e)
- {
- ((Button)sender).Enabled=false;
- Pause_btn.Enabled=true;
- //запускаем поток, передам ему кнопку
- t1.Start(First_btn);
- t2.Start(Second_btn);
- t3.Start(Third_btn);
- }
- private void Stop_btn_Click(object sender, EventArgs e)
- {
- //есть специальная ф-ция для остановки потока
- t1.Abort();
- t2.Abort();
- t3.Abort();
- Start_btn.Enabled =true;
- Pause_btn.Enabled=false;
- }
- private void Pause_btn_Click(object sender, EventArgs e)
- {
- //тут убирается ставшая лишней проверка
- t1.Suspend();
- t2.Suspend();
- t3.Suspend();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д