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

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


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

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

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