0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 15
1

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

10.08.2014, 22:40. Показов 1407. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть листинг программы и форма, на форме 3 кнопки, которые в случайном порядке перемещаются по оси х и 3 кнопки управления, старт, стоп и пауза. Кто может подсказать, почему у меня при нажатии на кнопку старт не перемещаются кнопки.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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);
     }
    
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2014, 22:40
Ответы с готовыми решениями:

Как запустить определённый код в отдельном потоке по нажатию кнопки?
как запустить определённый код в отдельном потоке по нажатию кнопки?(этот код бесконечен)

Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код
Здравствуйте! Пытаюсь загрузить картинку по ссылке из инета в ImageView в отдельном потоке. Поток...

Исправить мой код, что бы круг рисовался при нажатии кнопки мышки
#include <QApplication> #include <QCursor> #include <unistd.h> #include <QPoint> #include...

Добавление кнопки в новом потоке
Подскажите как в новом потоке добавить кнопку на форму?

3
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
10.08.2014, 22:49 2
C#
1
2
3
4
5
6
public Form1()
{
    this.InitializeComponent();
    helper = this.Motion;
    this.r = new Random();
}
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
11.08.2014, 14:48 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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();
     }
0
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 1
20.01.2016, 23:12 4
Цитата Сообщение от Learx Посмотреть сообщение
t1.Start(First_btn);
t2.Start(Second_btn);
t3.Start(Third_btn);
Но так не получается обращаться к потокам.
0
20.01.2016, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2016, 23:12
Помогаю со студенческими работами здесь

Узнать о нажатии кнопки в потоке
Подскажите корректно ли я делаю, на форме есть множество кнопок, их нажатие обрабатывается в...

Ошибка при смене цвета кнопки в потоке
Сделал поток Thread DowloadThread = new Thread(new Runnable() { @Override public void...

Скажите, пожалуйста, как исправить исправить код в процедуре
задание такое :Дан одномерный массив. Переместить нулевые элементы массива в начало, сдвинув...

Не выполняется код в потоке
Пытаюсь сделать один поток, что бы основной код работал в нем, но, почему то, код не выполняется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru