Вопрос о многопоточности
От: vasilov  
Дата: 24.09.06 02:58
Оценка:
Попробую описать ситуацию на словах.
Имеется backgroundWorker. На его событие report подписано несколько функций.
В одной из них заполняется список. В определенный момент времени в этой же функции открывается новая форма.
Возможно и модальная. В дальнейшем эта же функция должна продолжать заполнять список и обновлять этот список в форме.
Вот тут то и вопрос. Можно ли так работать со ВТОРОЙ формой?

Я экспериментировал с label на второй форме. Вроде не глючило. Но многопоточность такая вещь, что лучше спросить.
Re: Вопрос о многопоточности
От: shelkovnikov Россия  
Дата: 24.09.06 06:02
Оценка:
Здравствуйте, vasilov, Вы писали:

V>Попробую описать ситуацию на словах.

V>Имеется backgroundWorker. На его событие report подписано несколько функций.
V>В одной из них заполняется список. В определенный момент времени в этой же функции открывается новая форма.
V>Возможно и модальная. В дальнейшем эта же функция должна продолжать заполнять список и обновлять этот список в форме.
V>Вот тут то и вопрос. Можно ли так работать со ВТОРОЙ формой?

V>Я экспериментировал с label на второй форме. Вроде не глючило. Но многопоточность такая вещь, что лучше спросить.


label может и не глючит, но часть контролов требуют чтобы доступ к ним осущестлялся из создавшего их потока (для этого смотри BeginInvoke и Invoke)
есть еще особенность часть конролов (WebBrowser, например) требует чтобы его поток был STA, а нормальная много поточная работа возможна только в MTA. Чтобы обойти это ограничение нужно создать дополнительный поток добавив к классу формы примерно такие методы


        private static MyForm container = null;

        private static void startForm()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyForm);
        }
// вернет ссылку на форму если нужна обработка
        public static MyForm Browser
        {
            get
            {
                lock (staticSyncRoot)
                    if (container == null)
                        thread = new Thread(new ThreadStart(startForm));
                        thread.SetApartmentState(ApartmentState.STA);
                        thread.Start();
                while (container == null)
                    Application.DoEvents();
                return container;
            }
        }
Re: Вопрос о многопоточности
От: GlebZ Россия  
Дата: 24.09.06 06:37
Оценка:
Здравствуйте, vasilov, Вы писали:

V>Попробую описать ситуацию на словах.

V>Имеется backgroundWorker. На его событие report подписано несколько функций.
Что это за событие report? Гарантируется ProgressChanged и RunWorkerCompleted будут выполнены в потоке GUI. В них ты можешь безопасно общаться.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[2]: Вопрос о многопоточности
От: vasilov  
Дата: 24.09.06 07:59
Оценка:
Здравствуйте, GlebZ, Вы писали:

V>>Имеется backgroundWorker. На его событие report подписано несколько функций.

GZ>Что это за событие report? Гарантируется ProgressChanged и RunWorkerCompleted будут выполнены в потоке GUI. В них ты можешь безопасно общаться.
Да конечно же событие ProgressChanged. Просто не было студии на компе, а по памяти не вспомнилось название.
Я в курсе что с формой в этом событии можно взаимодействовать. В прочитанных мной статьях это было явно сказано.
Но можно ли взаимодействовать с другой формой, причем созданной этим же событием ранее?.
Re[3]: Вопрос о многопоточности
От: GlebZ Россия  
Дата: 24.09.06 08:01
Оценка:
Здравствуйте, vasilov, Вы писали:

V>Но можно ли взаимодействовать с другой формой, причем созданной этим же событием ранее?.

Да
... << RSDN@Home 1.2.0 alpha rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.