Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 23.03.2020
Сообщений: 1

Проблемы при работе с потоками

27.04.2020, 02:12. Показов 437. Ответов 0

Студворк — интернет-сервис помощи студентам
Возникла проблема с тем, что когда я пытаюсь блокировать ball или ball2 с помощью Monitor.Wait у меня блокируется и ball и ball2(83 и 71 строки). Уже второй день с этим не могу разобраться((
(В Go, Go2 заполняю очередь а в Animate пробую рисовать на панельке то что в очереди)
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
public void Start()
        {
            stop = false;
            ThreadStart Th = new ThreadStart(Go2);
            t1 = new Thread(Th);
            t1.Start();
            ThreadStart ttth = new ThreadStart(Go);
            t2 = new Thread(ttth);
            t2.Start();
            ThreadStart th = new ThreadStart(Animate);
            t = new Thread(th);
            t.Start();
            N = 0;
 
        }
        private void Go2()
        {
            CommonData abc = new CommonData();
            BALL2 = abc;
            while (!stop)
            {
                Monitor.Enter(BALL2);
                Ball b = new Ball(R);
                b.UUpdate(R);
                b.start();
                BALL2.Add(b, 1);
                Monitor.Exit(BALL2);
            }
        }
        private void Go()
        {
            CommonData abc = new CommonData();
            BBB = abc;
            while (!stop)
            {
                Monitor.Enter(BBB);
                Ball b = new Ball(R);
                b.UUpdate(R);
                b.start();
                BBB.Add(b,0);
                Monitor.Exit(BBB);
            }           
        }
        private void Animate()
        {
            while (N<2)
            {
                Thread.Sleep(30);
                if (BBB != null)
                { ball = BBB.GetNextTriplet(); N++; }
                if (BALL2 != null)
                { N++; ball2 = BALL2.GetNextTriplet(); }
            }
            //ball3 = BALL3.GetNextTriplet();
            while (!stop)
            {         
                Monitor.Enter(obj);
                Graphics g = bg.Graphics;
                bgChanged = false;
                Monitor.Exit(obj);
                Monitor.Enter(obj);
                g.Clear(Color.White);
                Monitor.Exit(obj);
                Monitor.Enter(ball);
                if (ball[0] != null)
                {
                    ball[0].Animate(g, R);
                    if (ball[0].RR.X > ball[0].R.Width / 2 - 10 && ball[0].RR.X < ball[0].R.Width / 2 + 10 && ball[0].RR.Y < ball[0].R.Height / 2 + 10)
                    {
                        aaa[0] = ball[0].C.R;
                        Monitor.Wait(ball);
                        //ball = BBB.GetNextTriplet();
                    }
                }
                Monitor.Exit(ball);
                Monitor.Enter(ball2);
                if (ball2[0] != null)
                {
                    ball2[0].Animate(g, R);
                    if (ball2[0].RR.X > ball2[0].R.Width / 2 - 10 && ball2[0].RR.X < ball2[0].R.Width / 2 + 10 && ball2[0].RR.Y < ball2[0].R.Height / 2 + 10)
                    {
                        aaa[0] = ball2[0].C.G;
                        Monitor.Wait(ball2);
                        //ball = BBB.GetNextTriplet();
                    }
                }
                Monitor.Exit(ball2);
                Monitor.Enter(obj);
                if (!bgChanged)
                    {
                        try
                        {
                            bg.Render();
 
                        }
                        catch (Exception e)
                        {
 
                        }
                    }
                Monitor.Exit(obj);
                Thread.Sleep(30);
            }
        }
Это очередь если что
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
class CommonData
    {
        private int col = new int();
        private int nomer = 0;
        //private Random rand = new Random();
        private Queue<Ball>[] vals = {
            new Queue<Ball>(),
                    new Queue<Ball>(),
                    new Queue<Ball>()
           };
    public void Add( Ball value, int index)
        {
 
            col = 35;
            if (index == 0) value.C = Color.FromArgb(col, 0, 0);
            if (index == 1) value.C = Color.FromArgb(0, col, 0);
            if (index == 2) value.C = Color.FromArgb(0, 0, col);
            value.lnp = index;
            var q = vals[nomer];
            if (q != null)
            {
                Monitor.Enter(q);
                try
                {
                    while (q.Count >= 4)
                    {
                        Monitor.Wait(q);
                    }
                    q.Enqueue(value);
                    Monitor.PulseAll(q);
                }
                catch (Exception e) { }
                finally
                {
                    Monitor.Exit(q);
                }
                nomer = (nomer + 1) % 3;
            }
        }
 
        public Ball[] GetNextTriplet()
        {
            Ball[] res = { null, null, null };
            for (int i = 0; i < vals.Length; i++)
            {
                var q = vals[i];
                if (q != null)
                {
                    Monitor.Enter(q);
                    try
                    {
                        while (q.Count == 0)
                        {
                            Monitor.Wait(q);
                        }
                        res[i] = q.Dequeue();
                        Monitor.PulseAll(q);
                    }
                    catch (Exception e)
                    {
                    }
                    finally
                    {
 
                        Monitor.Exit(q);
                    }
                }
            }
            return res;
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2020, 02:12
Ответы с готовыми решениями:

Ошибка при работе с потоками
Пишу программу которая меняет обои рабочего стола , и вот код программы using System; using System.Collections.Generic; using...

Ошибка при работе с потоками
Проблема в том что , сколько я указал потоков столько программа проходит строк . Типо : 50 потоков = 50 строк как это исправить? ...

Проблема при работе с потоками
Помогите решить тупую проблему! Есть массив строк: String MassStr = new String{'one', 'two', 'three'}; Теперь я хочу чтобы...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2020, 02:12
Помогаю со студенческими работами здесь

Ошибка при работе с потоками
void __fastcall TForm1::FormCreate(TObject *Sender) { haha *Thr = new haha(true); Thr-&gt;Priority=tpTimeCritical; Thr-&gt;Resume(); } ...

Ошибка при работе с потоками
Есть две функции: одна закидывает изображения в вектор, а вторая забирает их оттуда и обрабатывает. Разделил приложение на два потока, хочу...

Поргресс Бар при работе с потоками
Здравствуйте. У меня вот такая проблема, написал программу, которая копирующий файлы с одной папки в другую. Теперь хочу прикрепить к...

Deadlocked ошибка. При работе с потоками
Здравствуйте! Возникла такая ошибка. В работе. Transaction (Process ID 536) was deadlocked on lock resources with another process and...

Ошибка при работе с потоками. WTF?!?
Здравствуйте. Вообщем есть форма. На ней есть несколько текстбоксов для ввода данных, пару лейблов и кнопка. Код обработчика кнопки : ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru