Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 07.11.2015
Сообщений: 57
.NET 4.x

Не правильно работает многопоточность

18.12.2016, 17:49. Показов 1683. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь с проблемой, очень долго не могу разобраться, приложение - гонки машин(picturebox)
При нажатии на кнопку button1 - 3 машины начинают движутся пока не достигнут финиша.
При нажатии кнопки Button3 (Закончить) - машины должны останавливаться и должен выводиться результат.
Почему то при нажатии на вторую кнопку окончания гонки машины останавливаются не все раз через раз( некоторые потоки не ставятся на паузу) Очень долго мучаюсь с этой проблемой прошу помочь.
Форма:

Код:
Кликните здесь для просмотра всего текста
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; //Именно это пространство имен поддерживает многопоточность
 
namespace lab8
{
    public partial class Form1 : Form
    {
        string winer;
        public bool enab = true, st = false, pr = false;
        Random random;
        Thread[] threads;
        object sync;
        int z = 5,q=0;
        int stop = 1295;
        DateTime dt;
 
        public Form1()
        {
            InitializeComponent();
            random = new Random();
            sync = new object();
 
            threads = new Thread[]
            {
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true },
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true },
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true }
            };
        }
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            q = 0;
            stop = 1295;
            if (st == false)
            {
                PictureBox[] pbs = { pictureBox1, pictureBox2, pictureBox3 };
                pictureBox1.Left = 15;
                pictureBox3.Left = 15;
                pictureBox2.Left = 15;
                dt = DateTime.Now;
                for (int i = 0; i < threads.Length; i++)
                {
                    threads[i].Start(pbs[i]);
                }
                //button1.Enabled = false;
                button2.Enabled = true;
                st = true;
            }
            else
            {
                pictureBox1.Left = 15;
                pictureBox3.Left = 15;
                pictureBox2.Left = 15;
                dt = DateTime.Now;
                for (int i = 0; i < threads.Length; i++)
                {
                    try
                    {
                        threads[i].Suspend();
                    }
                    catch { }
                }
                for (int i = 0; i < threads.Length; i++)
                {
                    threads[i].Resume();
                }
            }     
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            q = 0;
            int mx = 1;
            if (pictureBox1.Left > mx) { mx = pictureBox1.Left; }
            if (pictureBox2.Left > mx) { mx = pictureBox2.Left; }
            if (pictureBox3.Left > mx) { mx = pictureBox3.Left; }
            stop = mx;
            label1.Text = winer;
           
 
            //button1.Enabled = true;
            //st = true; 
            //Thread.Sleep(100);
 
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (q==1) { label1.Text = winer; }
        }
 
        void Movement(object picturebox)
        {
            int x = 8;
            PictureBox pb = (PictureBox)picturebox;
            
            while (true)
            {
                Thread.Sleep(x);  // задержка потока повремени
                int offset = 0;
                //lock (sync)
                //{
                    offset = random.Next(2, 5);
                //}
 
                pb.BeginInvoke(new Action(delegate
                {
                    pb.Location = new Point(pb.Location.X + offset, pb.Location.Y);
                }));
                
                if ((pb.Left >= stop) && (q == 0))
                {
                    //MessageBox.Show(stop.ToString());
                    q = 1;
                    z = Convert.ToInt32(pb.Tag)+1;
                    TimeSpan vr1 = DateTime.Now - dt;
                    winer=("Победил игрок №"+z.ToString()+ "\n"+ "Время - "+ vr1.Seconds + "."+ vr1.Milliseconds.ToString().PadLeft(3, '0') + "\n");
 
                    for (int i = 0; i < threads.Length; i++)
                    {
                        //MessageBox.Show(i.ToString());
                        threads[i].Suspend();
                    }
                }
                
            }
            
           
 
        }
 
        
 
        private void button3_Click(object sender, EventArgs e)
        {
            
            for (int i = 0; i < threads.Length; i++)
            {
                
                try
                {
                    threads[i].Suspend();
                    //enab = false;
                }
                catch { }
            }
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            //if (enab ==false)
            //{
                for (int i = 0; i < threads.Length; i++)
                {
                    try
                    {
                        threads[i].Resume();
                    }
                    catch { }
                }
            //}
        }
    }
 
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2016, 17:49
Ответы с готовыми решениями:

Как правильно организовать многопоточность?
Всем привет! Если кратко Мне нужно организовать выполнение одной большой не цикловой задачи в отдельном потоке. При этом нужно 1....

Как правильно реализовать многопоточность
Сколько не замечаю тем у многих проблема с многопоточностью, а именно с правильной ее реализацией... Прикладываю проэкт, пожалуйста,...

Как правильно реализовывается многопоточность
Здравствуйте! Стоит задача создать несколько потоков, которые будут выполнять какие-то действия. У Шлее (профессиональное...

5
1 / 1 / 0
Регистрация: 07.11.2015
Сообщений: 57
18.12.2016, 18:11  [ТС]
Писал программу пользуясь данной темой - Как применить потоки для игры "Гонки кнопок"
0
1 / 1 / 0
Регистрация: 07.11.2015
Сообщений: 57
18.12.2016, 18:22  [ТС]
Сам проект
Вложения
Тип файла: rar pr.rar (217.2 Кб, 3 просмотров)
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
18.12.2016, 18:43
Один из потоков, будет пытаться остановить все потоки, включая себя. А что если он первым остановит себя? В этом случае он не сможет остановить другие потоки.
1
1 / 1 / 0
Регистрация: 07.11.2015
Сообщений: 57
18.12.2016, 18:58  [ТС]
Как исправить данную проблему помоги пожалуйста кодом

Добавлено через 3 минуты
Как узнать какой поток останавливать последним?
C#
1
2
3
4
5
for (int i = 0; i < threads.Length; i++)
                    {
                        //MessageBox.Show(i.ToString());
                        threads[i].Suspend();
                    }
Добавлено через 4 минуты
Разобрался! Спасибо!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (z-1 == 0)
                    {
                        threads[1].Suspend();
                        threads[2].Suspend();
                        threads[0].Suspend();
                    }
                    if (z - 1 == 1)
                    {
                        threads[0].Suspend();
                        threads[2].Suspend();
                        threads[1].Suspend();
                    }
                    if (z - 1 == 2)
                    {
                        threads[0].Suspend();
                        threads[1].Suspend();
                        threads[2].Suspend();
                    }
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
18.12.2016, 18:58
Лучший ответ Сообщение было отмечено sp70 как решение

Решение

C#
1
2
3
4
5
6
7
                    for (int i = 0; i < threads.Length; i++)
                        if (threads[i].ManagedThreadId != Thread.CurrentThread.ManagedThreadId)
                        {
                            //MessageBox.Show(i.ToString());
                            threads[i].Suspend();
                        }
                    Thread.CurrentThread.Suspend();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2016, 18:58
Помогаю со студенческими работами здесь

Многопоточность, как правильно передавать параметры?
#include &quot;lcbot.h&quot; #include &quot;game.h&quot; #include &lt;windows.h&gt; #include &lt;process.h&gt; #include &lt;stdio.h&gt; game Game; ...

многопоточность не работает
Здравствуйте. Пытаюсь вызвать многопоточность QVector&lt;double&gt; Perebor; //перебор значений стратегии for (double...

Не работает многопоточность
Добрый день. Решил заняться многопоточнстью на C#, но что-то пошло не так - она не работает. using System; using System.Threading; ...

Lock не работает (многопоточность)
Здравствуйте. Есть такой код. namespace mysync { class Program { static void Main(string args) { ...

Не работает многопоточность в libcurl
Всем привет. Пытаюсь сделать прогу работающую с двумя потоками, которая грузит страницу гугла в два файла. Проблема:...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru