Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/39: Рейтинг темы: голосов - 39, средняя оценка - 4.97
 Аватар для Flexo
10 / 9 / 5
Регистрация: 26.02.2011
Сообщений: 150

Взаимодействие между потоками

05.05.2011, 14:28. Показов 8183. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В ходе выполнения программы необходимо, чтобы определенные действия выполнялись в отдельном потоке (дабы программа не подвисала), и по мере выполнения вносили определенный изменения на основной форме.
Проблема в том, что из вновь созданного потока нельзя обращаться к элементам формы, иначе получаем исключение:
Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
Каким образом можно организовать взаимодействие между потоками?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2011, 14:28
Ответы с готовыми решениями:

Обмен данных между потоками
Имеется 2 потока (основной и рабочий) В рабочем потоке появляется строка, которая должна передаваться в основной поток, где выполняются...

Загрузить или передать изображение между потоками
Извиняюсь, если тема бородата, но всё же не могу понять как передать изображение другому потоку. Создаю поток: new Thread(delegate() {...

Взаимодействие между окнами
В WinForms передавал нужные данные в качестве параметров при создании формы. Как грамотно делать это в WPF? Почитал Взаимодействие...

6
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
05.05.2011, 14:34
C#
1
2
3
4
<Название элемента управления>.Invoke(new Action(() => 
{
      //действия
}));
1
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
05.05.2011, 14:35
Control.Invoke не пробовали использовать? думаю вам поможет в данной ситуации
1
 Аватар для Flexo
10 / 9 / 5
Регистрация: 26.02.2011
Сообщений: 150
05.05.2011, 15:53  [ТС]
Хоть убейте, не хватает мозгов куда этот Invoke втыкать...
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
void prev_load(string path, int index) 
        {
            Image img = new Image();
            img.Height = 70;
            img.Width = 70;
            img.Source = new BitmapImage(new Uri(path));
            img.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(Mouse_Click);
            gallery_prev.ColumnDefinitions.Add(new ColumnDefinition()); //вот тут нужно добавить новый столбик на Grid который расположен на основной форме
            Grid.SetRow(img, 0);
            Grid.SetColumn(img, index);
            gallery_prev.Children.Add(img); //здесь добавить img
 
        }
void folder_prev()
        {
            fullfilesPath = System.IO.Directory.GetFiles(open_folder.SelectedPath,"*.jpg");
            for (int i = 0; i < fullfilesPath.Length; i++)
            {
                prev_load(fullfilesPath[i], i);
                
            }
 private void Folder_Open(object sender, RoutedEventArgs e)
        {
                Thread potok = new Thread(new ThreadStart(folder_prev));
                potok.SetApartmentState(ApartmentState.STA); 
                potok.Start();
            }
        }
Как в моем случае Invoke пользовать?

Добавлено через 42 минуты
Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
gallery_prev.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
            {
                gallery_prev.ColumnDefinitions.Add(new ColumnDefinition()); //здесь все работает нормально, к Grid добавляется нужное количество столбцов     
            }));
            Grid.SetRow(img, 0);
            Grid.SetColumn(img, index);
            gallery_prev.Dispatcher.BeginInvoke(new Action(() =>
            {
            gallery_prev.Children.Add(img); //здесь срабатывает исключение
            }));
Получается следующее исключение:
Миниатюры
Взаимодействие между потоками  
0
20 / 20 / 1
Регистрация: 28.02.2011
Сообщений: 72
05.05.2011, 17:25
Взаимодействие потоков.
1
 Аватар для Flexo
10 / 9 / 5
Регистрация: 26.02.2011
Сообщений: 150
06.05.2011, 12:12  [ТС]
Цитата Сообщение от Grun**** Посмотреть сообщение
Вот только я с WPF все делаю, и там InvokeRequired отсутствует...

Добавлено через 3 часа 0 минут
В общем разобрался. Оставлю решение для потомков:

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
private void AddPhoto(string photo_path, int index)
        {
            // Если процесс пытающийся изменить Grid на основной форме находится в том же потоке в котором создавалась основная форма...
            if (gallery_prev.Dispatcher.Thread == Thread.CurrentThread)
            {
                Image img = new Image();
                img.Height = 70;
                img.Width = 70;
                img.Source = new BitmapImage(new Uri(photo_path));
                img.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(Mouse_Click);
                gallery_prev.ColumnDefinitions.Add(new ColumnDefinition());
                Grid.SetRow(img, 0);
                Grid.SetColumn(img, index);
                gallery_prev.Children.Add(img);
            }
            else  //если процесс в другом потоке
            {
                gallery_prev.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate() {
                Image img = new Image();
                img.Height = 70;
                img.Width = 70;
                img.Source = new BitmapImage(new Uri(photo_path));
                img.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(Mouse_Click);
                gallery_prev.ColumnDefinitions.Add(new ColumnDefinition());
                Grid.SetRow(img, 0);
                Grid.SetColumn(img, index);
                gallery_prev.Children.Add(img);
                }));
            }
        }
 
private void Folder_Open(object sender, RoutedEventArgs e)
        {
                Thread potok = new Thread(new ThreadStart(folder_prev));
                potok.SetApartmentState(ApartmentState.STA); 
                potok.Start();
        }
Это справедливо для WPF, для WinForms все будет несколько иначе
0
2 / 2 / 0
Регистрация: 24.03.2015
Сообщений: 3
31.03.2015, 15:08
Кликните здесь для просмотра всего текста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2015, 15:08
Помогаю со студенческими работами здесь

Взаимодействие между формами
Доброго времени суток. Прошу помощи. Как сделать так, чтобы по клику на кнопку &quot;SendEmail&quot; в форме Mail (поле email) появился...

Взаимодействие между формами
Доброго времени суток! У меня есть 2 формы(WPF). Для меня всегда было интересным, как реализовывать взаимодействие между формами(на...

Взаимодействие между viewmodel - ями
Разбираюсь с MVVM. Возник вопрос. Допустим есть 3 ViewModel: MainViewModel, ContentViewModel и NestedViewModel. ContentViewModel...

Взаимодействие между двумя UserControl
Доброго всем дня! Имеется такой вопрос: Создано главное Окно на WPF, отдельно в этом же пространстве имен создается два UserControlа и...

MVVM. Silverlight. Взаимодействие между View
Подскажите пожалуйста, как реализовать следующее: Есть MainPage, где есть 2 области (два UserControl'а). Т.е. выглядит примерно так: ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru