Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 3 / 1
Регистрация: 01.05.2015
Сообщений: 50

Ошибка «Недопустимая операция в нескольких потоках: попытка доступа к элементу управления»

20.12.2015, 21:01. Показов 2103. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю вот, собсно, этот код.. я его еще не дописал правда.. решил оттестировать в мэйне метод. а он вылетает на строке:
C#
1
Form1.ActiveForm.Controls.Add(boardpic[index]);
с ошибкой:
"Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления '' не из того потока, в котором он был создан."
Уже всё перерыл... не могу понять, что к чему.. Заранее спасибо!



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
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;
 
namespace Boals
{
    public partial class Form1 : Form
    {
        static Image[] images = {
                                    Boals.Properties.Resources.Blue,
                                    Boals.Properties.Resources.Green,
                                    Boals.Properties.Resources.Grey,
                                    Boals.Properties.Resources.Orange,
                                    Boals.Properties.Resources.Red,
                                    Boals.Properties.Resources.Yellow
                                };
 
        static int[,] board = new int[9, 9]; //матрица поля       
        static List<PictureBox> boardpic = new List<PictureBox>();
        static List<PictureBox> nextpic = new List<PictureBox>();
 
 
        public Form1()
        {
            
 
            List<int[]> a = new List<int[]>();
            a.Add(new int[] { 2, 3 });
            a.Add(new int[] { 4, 5 });
            a.Add(new int[] { 6, 3 });
            a.Add(new int[] { 1, 2 });
            List<int> val = new List<int>();
            val.Add(5);
            val.Add(4);
            val.Add(1);
            SetBoard(board, a, val);
 
            InitializeComponent();
 
        }
 
 
        static int FindEmpty(int [,] bord)
        {
            int result = 0;
            for (int i = 0; i <= bord.GetLength(0); i++)
                for (int j = 0; j <= bord.GetLength(1); j++)
                    if (bord[i, j] == 0) result++;
            return result;
        }
 
        static List<int[]> GetEmpty(int[,] bord) //возвращает массив свободных координат
        {
            int numofempt = FindEmpty(bord);
            List<int[]> result = new List<int[]>();
 
            for (int i = 0; i <= bord.GetLength(0); i++)
                for (int j = 0; j <= bord.GetLength(1); j++)
                    if (bord[i, j] == 0) result.Add(new int[]{ i, j });
            return result;
        }
 
        static List<int> GetNext(int empty) //ищет, какие шарики будут в выставлены в следующий раз
        {
            Random numrand = new Random();
            Random valrand = new Random();
            List<int> values = new List<int>();
 
            for (int i = 0; i <= ((empty >= 6) ? numrand.Next(6) : numrand.Next(empty)); i++)
                values[i] = valrand.Next(1, 7);
 
            return values;
        }
 
        static void SetBoard(int[,] desk, List<int[]> emptycoo, List<int> val)
        {
            if (val.Count > 0)
            {
                Random coorand = new Random();
                int ind = coorand.Next(val.Count);
                int x = emptycoo[ind][0];
                int y = emptycoo[ind][1];
                desk[x, y] = val[0];
                emptycoo.RemoveAt(ind);
                val.RemoveAt(0);
 
                int index = 0;
                if(boardpic.Contains(null))
                {
                    index = boardpic.IndexOf(null);
                    boardpic[index] = new PictureBox();
                }
                else
                {
                    boardpic.Add(new PictureBox());
                    index = boardpic.Count - 1;
                }
                boardpic[index].Location = new Point(307 + x * 41, 110 + y * 41);
                boardpic[index].BackColor = Color.Transparent;
                boardpic[index].Image = images[desk[x, y]];
                boardpic[index].Name = "im";
                Form1.ActiveForm.Controls.Add(boardpic[index]);
 
                SetBoard(desk, emptycoo, val);
            }
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2015, 21:01
Ответы с готовыми решениями:

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления
Пробовал через: System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; Вылазит ошибка: В...

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления не из того потока, в
Добрый день. В обработчике события выполняю такой код: /// &lt;summary&gt; /// Обработчик страта загрузки ///...

Ошибка в потоках: Попытка доступа к элементу управления не из того потока, в котором он был создан
Нужно сделать счетчик, и при каждом выполнении потока изменять значение label2.Text

2
Заблокирован
20.12.2015, 21:11
Саня Сталин, Ответы на 7 самых частых вопросов по WinForms где то ты потоки юзаешь, в коде не вижу вроде, значит не весь код дал
0
3 / 3 / 1
Регистрация: 01.05.2015
Сообщений: 50
20.12.2015, 22:13  [ТС]
Вот весь проект.. Умоляю, посмотри, пожалуйста( Ваще не могу понять, где ошибка
Вложения
Тип файла: rar Boals.rar (196.8 Кб, 5 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.12.2015, 22:13
Помогаю со студенческими работами здесь

Недопустимая операция в нескольких потоках
private void url_button_Click(object sender, EventArgs e) { textarea.Text = &quot;&quot;; string url =...

Недопустимая операция в нескольких потоках
Вроде всё правильно

Недопустимая операция в нескольких потоках
Приветствую! Задался задачей реализовать подобный пример на WinForms, заменив консоль textBox'ом на форме. Сначала возникли непонятные...

Недопустимая операция в нескольких потоках
Код: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; ...

Недопустимая операция в нескольких потоках
1. Есть класс MyClass в котором метод MyMethod каждую секунду увеличевает переменную на a 1 и TestEvent - событие которое срабатывает...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru