Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
6 / 6 / 3
Регистрация: 22.06.2010
Сообщений: 320

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

25.07.2011, 18:09. Показов 2769. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такая ситуация.

Хочу создать отдельный поток, чтобы в нем загружались картинки для кнопок, которые находятся на пользовательском тулбаре. Для этого есть метод LoadXML(string fileName). В обработчике события создал поток для этого метода:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void btn_loadXml_Click(object sender, EventArgs e)
        {
            
            string xmlPath = tb_pathXml.Text;
            //создание вторичного потока
            Thread thrd = new Thread(new ParameterizedThreadStart(toolBar1.XmlLoad));
            //запуск потока с параметрами
            thrd.Start(xmlPath);     
            
            //toolBar1.XmlLoad(@xmlPath);
 
            cbx_image.DisplayMember = "Name";
            cbx_image.ValueMember = "Value";
            cbx_image.Items.Add(new ComboBoxItem("Изображение 1", imagePath));
            cbx_image.Items.Add(new ComboBoxItem("Изображение 2", imagePath));
            cbx_image.SelectedIndex = 0;
            cbx_buttonID.Items.Add("btn1");
            cbx_buttonID.Items.Add("btn2");
        }
Но когда нажимаю на кнопку выдает ошибку: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "toolBar1" не из того потока, в котором он был создан.

Вот сам метод LoadXML, который создан в классе: ToolBar

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
public void XmlLoad(object obj)
        {
                string path = (string)obj;
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                int x = 3; int y = 10;
                //получаем все дочерние элементы корневого узла
                foreach (XmlNode ch in doc.DocumentElement.ChildNodes)
                {
                    Button button1 = new Button();
 
                    foreach (XmlAttribute atr in ch.Attributes)
                    {
                        if (atr.Name == "id")
                            button1.Name = atr.Value;
                        if (atr.Name == "img")
                        {
                            button1.BackgroundImage = Image.FromFile(atr.Value);
                        }
                        if (atr.Name == "text")
                            button1.Text = atr.Value;
                    }
                    button1.Location = new Point(x, y);
                    button1.ImageAlign = ContentAlignment.BottomCenter;
                    button1.Size = new System.Drawing.Size(88, 32);
            
                //добавить кнопку в тулбар
                this.Controls.Add(button1);
                x = x + 150;
            }
        }
Ошибку выдает на строке: this.Controls.Add(button1);

Помогите разобраться в чем дело.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2011, 18:09
Ответы с готовыми решениями:

Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан."
Код клиента: public partial class Form1 : Form { string IP; string Port; Socket socket; ...

Почему первый вариант дает исключение "Недопустимая операция в нескольких потоках", а второй нет?
есть два варианта кода: Task.Run(() => { for (; ; ) { ...

Ошибка «Недопустимая операция в нескольких потоках: попытка доступа к элементу управления»
Создаю вот, собсно, этот код.. я его еще не дописал правда.. решил оттестировать в мэйне метод. а он вылетает на строке:...

3
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
25.07.2011, 19:11
эта ситуация называется cross thread operation: вы пытаетесь из одного потока изменить что-либо в другом потоке. напрямую это делать нельзя

измените немного свой код:

Цитата Сообщение от dimiby Посмотреть сообщение
C#
1
this.Controls.Add(button1);
C#
1
2
3
this.Invoke((MethodInvoker)delegate() {
                   this.Controls.Add(button1);
                });
проверил данное дейсвтие на схематическом коде. действие в принципе то же
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
using System;
using System.Threading;
using System.Windows.Forms;
 
namespace TempWinFormProject {
    public partial class Parent : Form {
        public Parent() {
            InitializeComponent();
        }
 
        void ChangeText(object o) {
            if(this.InvokeRequired) {
                this.Invoke((MethodInvoker)delegate() {
                    this.Text = (string)o;
                });
            } else {
                this.Text = (string)o;
            }
        }
 
        private void button2_Click(object sender, EventArgs e) {
            (new Thread(new ParameterizedThreadStart(ChangeText))).Start("dsdasd");
        }
    }
}
2
6 / 6 / 3
Регистрация: 22.06.2010
Сообщений: 320
25.07.2011, 21:10  [ТС]
спасибо. работает, но не до конца понимаю код что вы скинули, можете описать действия, что в нем происходит.
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
25.07.2011, 21:15
Invoke выполняет указанный код в другом потоке.
в данном случае в том потоке, в котором была создана форма (объект this - текущее окошко)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2011, 21:15
Помогаю со студенческими работами здесь

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

Недопустимая операция в нескольких потоках
Подскажите как исправить этот исходник.

Недопустимая операция в нескольких потоках
Доброго времени суток. Вот код. void StartAll () { Thread.Sleep(2000); ...

Недопустимая операция в нескольких потоках
Че-то в соседнем разделе никто не откликнулся, так что спрошу здесь. Что-то непонятное происходит - пишу прогу с использованием...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru