Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )


> Работа с контролами из другого потока
Hmarik
Вставить ник
сообщение 12:06:2008, 14:21
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 36
Регистрация: 8:08:2005
Пользователь №: 2 120



Репутация:   2  


Есть окно.
Хочу поменять текст в label из другого потока.
Сделал вроде все как описано в MSDN.
Один раз если открыть диалог и в нем менять все работает.
Второй раз уже не работает (выскакивает исключение, что мол не безопасно все это).
Пытался искать и отслеживать что работает не так... добавил в метод изменения текста строчку для отладки System.Diagnostics.Debug.WriteLine("SetText"); .. стало работать без исключений... и что за фигня спрашивается?... почему выскакивает исключение без этой строки?

Проект прикреплен ...
Прикрепленные файлы
Прикрепленный файл  MigrationTool.zip ( 22.44 килобайт ) Кол-во скачиваний: 8
 
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 7)
Pasha
Вставить ник
сообщение 12:06:2008, 17:23
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 1 293
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257



Репутация:   29  


Ищи по форуму или в гугле Invoke/InvokeRequired.
Подняться вверх 
 
Сообщение #2
Hmarik
Вставить ник
сообщение 13:06:2008, 06:15
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 36
Регистрация: 8:08:2005
Пользователь №: 2 120



Репутация:   2  


Pasha
Так вроде нашел.. и почитал.. и вроде в выше приложенном файле применил.. но есть то, что есть.... что описано выше.
Подняться вверх 
 
Сообщение #3
Pasha
Вставить ник
сообщение 13:06:2008, 06:29
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 1 293
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257



Репутация:   29  


Hmarik
и на какой строчке в этом коде у тебя падает?
Подняться вверх 
 
Сообщение #4
Hmarik
Вставить ник
сообщение 14:06:2008, 20:22
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 36
Регистрация: 8:08:2005
Пользователь №: 2 120



Репутация:   2  


Pasha
Вот на этой строчке this.labelText.Text = text;

Как я и писал выше. Если один раз нажать на кнопку "Обновить", все проходит отлично.
При втором нажатии пишет что это не безопасно.
Если раскоментировать вот эту строчку //System.Diagnostics.Debug.WriteLine("SetText");, то все работает без предупреждений.
Подняться вверх 
 
Сообщение #5
Pasha
Вставить ник
сообщение 15:06:2008, 11:49
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 1 293
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257



Репутация:   29  


Проблема в том, что UpdateDB успевает начать работу быстрее, чем отработает m_formUpdate.ShowDialog. Поэтому в момент вызова InvokeRequired в SetText окно прогресса еще не создано, и InvokeRequired возвращает false. Вот, из msdn по InvokeRequired, секция Remarks:
Цитата
If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. If no appropriate handle can be found, the InvokeRequired method returns false.

This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

Чтобы решить мегапроблему, в потоке UpdateDB тебе нужно подождать создания окна перед тем, как начать работать с его контролами. Что-то типа:
private static void UpdateDB(Object ob)
{
    UpdateDBData updateDBData = (UpdateDBData)ob;

    while (!updateDBData.m_formUpdate.IsHandleCreated)
    {
        Thread.Sleep(0);
    }
...
Подняться вверх 
 
Сообщение #6
Hmarik
Вставить ник
сообщение 16:06:2008, 05:51
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 36
Регистрация: 8:08:2005
Пользователь №: 2 120



Репутация:   2  


Pasha
Действительно, все логично... спасибо.
Подняться вверх 
 
Сообщение #7
WolfTheGrey
Вставить ник
сообщение 22:06:2008, 04:58
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 1
Регистрация: 22:06:2008
Пользователь №: 18 142



Репутация:   0  


Отпешитесь пожалуйста где что и как можно почитать на русском языке по "InvokeRequired"

Нужно из второго потока постоянно передовать данные в виндовс-форму
Подняться вверх 
 
Сообщение #8


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись |  AJAX?
   

 

RSS Текстовая версия Сейчас: 9:01:2009 - 03:03

с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net