Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] Проблемы обработки события, генерируемого другим потоком

Ответить
Настройки темы
.NET - [решено] Проблемы обработки события, генерируемого другим потоком

Пользователь


Сообщения: 99
Благодарности: 3

Профиль | Отправить PM | Цитировать


надо:
из формы Form1 запустить поток, который через промежутки времени меняет контролы Form1.

сделано (думаю, что сделано):
вторичный поток генерирует событие, которое запускает обработчик в Form1. Обработчик в стеке отладчика виден как принадлежащий Form1, но при попытке изменения контрола Form1 программа вылетает по ошибке.

Ничего не понимаю. Что искать, как бороться?

Отправлено: 14:57, 08-02-2012

 

В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Barit, поясните, что значит
Цитата Barit:
меняет контролы Form1 »
Приведите код, какая ошибка....

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 15:01, 08-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 99
Благодарности: 3

Профиль | Отправить PM | Цитировать


Ошибка:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Cross-thread operation not valid: Control 'button_read_information' accessed from a thread other than the thread it was created on.

здается, не может получить доступа к контролу Form1.

но обработчик события запускается из Form1. Целенаправленно создавал его, чтоб уйти от этой ошибки.

Отправлено: 15:06, 08-02-2012 | #3


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Barit, Объясните конкретнее что вы хотите сделать.
Цитата Barit:
обработчик события запускается »
Какого события?

Прикрепите свой проект

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 15:18, 08-02-2012 | #4


Пользователь


Сообщения: 99
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt text_program.txt
(1.9 Kb, 11 просмотров)

надеюсь нужного не выбросил, выжимка в прилагаемом текстовом файле

Отправлено: 15:34, 08-02-2012 | #5


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Ну, судя по кускам кода, вы пытаетесь получить доступ к контролам "напрямую" из другого потока, что не правильно.

Почитайте про синхронизацию потоков.
Тут есть один из вариантов доступа к контролам из потока. Думаю, разберетесь.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 15:45, 08-02-2012 | #6


Пользователь


Сообщения: 99
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

О возможности использования *Invoke знаком, но по причине разветвленной и глубоко интегрированной ветки программы стараюсь избежать. Коряво получится.

Отправлено: 16:13, 08-02-2012 | #7


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Как временное решение проблемы, ЧТО НЕ ПРАВИЛЬНО с точки зрения безопасности программ, можешь написать перед изменением
Код: Выделить весь код
Control.CheckForIllegalCrossThreadCalls = false;
В таком случае исключение вызываться не будет при попытке доступа к контролам через другой поток.
Если же все делать правильно, то только через Invoke.

Пример, как я это реализовывал:

Код: Выделить весь код
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
		private void SetControlPropertyValue(Control oControl, string propName, object propValue)
		{
			if(oControl.InvokeRequired)
			{
				SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
				oControl.Invoke(d, new object[] { oControl, propName, propValue });
			}
			else
			{
				Type t = oControl.GetType();
				PropertyInfo[] props = t.GetProperties();
				foreach(PropertyInfo p in props)
				{
					if(p.Name.ToUpper() == propName.ToUpper())
					{
						p.SetValue(oControl, propValue, null);
					}
				}
			}
		}
Это функция, которую я вызываю при изменении из другого потока данных. Вызов довольно прост:

Код: Выделить весь код
SetControlPropertyValue(GroupResultPanel, "Visible", true);
Параметры:
1. Имя контрола
2. Имя свойства
3. Значение.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 09-02-2012 | #8


Пользователь


Сообщения: 99
Благодарности: 3

Профиль | Отправить PM | Цитировать


модератор изменил название темы, исказив суть, прошу заменить на название типа:
"С# проблемы обработки события генерируемого другим потоком"
и удалить это сообщение (либо сам удалю).

Отправлено: 09:54, 09-02-2012 | #9


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата Barit:
прошу заменить на название типа: »
Цитата Barit:
надо:
из формы Form1 запустить поток, который через промежутки времени меняет контролы Form1. »
Почему же искажена суть. То, что выдается сообщение об ошибке, является следствием неверного управления поведением программы для доступа из другого потока.Но, раз уж так хочется, изменю.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 13:41, 09-02-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] Проблемы обработки события, генерируемого другим потоком

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
EventID - Уведомление Ист. события: HHCTRL Категория события: Отсутствует. Код события: 1903 cleric1985_n Устранение критических ошибок Windows 7 27-11-2015 16:14
BSOD - Имя события проблемы: BlueScreen.... Titan2901 Устранение критических ошибок Windows 1 17-12-2009 14:23
EventID - Источник события: SceCli, код события: 1202, предупреждение 0x534 Michael Устранение критических ошибок Windows 3 28-01-2009 13:25
EventID - [решено] Источник события:Windows Installer 3.1 Код события: 4379 ozzik Устранение критических ошибок Windows 2 31-10-2007 15:41
Категория события: Доступ к службе каталогов - Код события: 565 Kostyl Microsoft Windows NT/2000/2003 1 19-10-2005 08:33




 
Переход