Бегущие кнопки в потоке - исправить код - 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();
}