![]() |
Проблемы обработки события, генерируемого другим потоком
надо:
из формы Form1 запустить поток, который через промежутки времени меняет контролы Form1. сделано (думаю, что сделано): вторичный поток генерирует событие, которое запускает обработчик в Form1. Обработчик в стеке отладчика виден как принадлежащий Form1, но при попытке изменения контрола Form1 программа вылетает по ошибке. Ничего не понимаю. Что искать, как бороться? |
Barit, поясните, что значит
Цитата:
|
Ошибка:
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. Целенаправленно создавал его, чтоб уйти от этой ошибки. |
Barit, Объясните конкретнее что вы хотите сделать.
Цитата:
Прикрепите свой проект |
Вложений: 1
надеюсь нужного не выбросил, выжимка в прилагаемом текстовом файле
|
Ну, судя по кускам кода, вы пытаетесь получить доступ к контролам "напрямую" из другого потока, что не правильно.
Почитайте про синхронизацию потоков. Тут есть один из вариантов доступа к контролам из потока. Думаю, разберетесь. |
что ошибка из - за доступа к контролам из другого потока, понятно. Поэтому хочу замутить генерацию события из вторичного потока с обработкой в основном, чтобы избежать этой ошибки. Возможно ли сделать, чтобы обработчик был из основного потока?
О возможности использования *Invoke знаком, но по причине разветвленной и глубоко интегрированной ветки программы стараюсь избежать. Коряво получится. |
Как временное решение проблемы, ЧТО НЕ ПРАВИЛЬНО с точки зрения безопасности программ, можешь написать перед изменением
Код:
Control.CheckForIllegalCrossThreadCalls = false; Если же все делать правильно, то только через Invoke. Пример, как я это реализовывал: Код:
delegate void SetControlValueCallback(Control oControl, string propName, object propValue); Код:
SetControlPropertyValue(GroupResultPanel, "Visible", true); 1. Имя контрола 2. Имя свойства 3. Значение. |
модератор изменил название темы, исказив суть, прошу заменить на название типа:
"С# проблемы обработки события генерируемого другим потоком" и удалить это сообщение (либо сам удалю). |
Цитата:
Цитата:
|
Время: 14:59. |
Время: 14:59.
© OSzone.net 2001-