Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как обратиться к форме из отдельного потока

88K
18 сентября 2013 года
powercat
2 / / 18.09.2013
Из стартовой формы программы запускаю таймер, кторый через равные промежутки времени запускает отдельный поток, который идет в инет и скачивает код некоторых страниц, помещает его в переменные и обрабатывает.

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

Все работает отлично. Данные принимаются, обрабатываются и записываются в файл.

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

Пишу просто - текстбокс.тхт=переменной, взятой из файла и далее форма.шоу
На панели винды появляется ярлык формы - но на экран она не выходит.

Подозреваю (и не спроста, т.к. если без потоков работать, она отображается нормально), что проблема в потоках. Читал про инвок - но вообще не понял, что за зверь.

Таким образом вопрос - как из отдельного потока обратиться к форме?
414
19 сентября 2013 года
CassandraDied
763 / / 24.05.2012
Про "инвок": есть поток GUI (где форма) и есть твой поток (который к сети обращается). Ты хочешь, чтобы сетевой поток обратился к объекту и вызвал какой-то метод. Если он так сделает, то метод будет выполняться в контексте сетевого потока, что запрещено и, в общем-то, имеет смысл. Поэтому метод надо вызывать в контексте потока GUI. Но как? Для этого и был придуман invoke.
В методе формы, который ты хочешь вызвать, тебе необходимо проверять

Код:
Func()
{
if (form.InvokeRequired)
{
    form.Invoke(Func)
}
else
{
    //code
}
}
Когда метод пытаются вызывать из чужого потока, то устанавливается свойство InvokeRequired. Ты можешь его проверить и, в зависимости от значения: либо вызвать делегат через Invoke (который заставляет выполняться делегат в потоке, которому принадлежит объект), либо просто продолжить выполнение метода.
88K
20 сентября 2013 года
powercat
2 / / 18.09.2013
Да это я все понимаю, про обмен данными между потоками. Вопрос был чисто практический - как, т.к. Form.show() через инвок сделать. Уже ответили ))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог