Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оторвать функционал от GUI, чтоб GUI не висло, GUI перестаёт отвечать 
V
    Опции темы
igsilya
Дата 20.10.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Код

namespace NameSpace
{

    public partial class Form1 : Form
    {

        private void Button1_Click(object sender, EventArgs e)
        {
            Выполнить_Мега_Адскую_И_Долгую_Работу();
        }
    
    }

}


при этом пока работает функция GUI "не отвечает" и окошко не перерисовывается, хотя там идёт вывод в текст боксы на форме.
Очень хотелось бы видеть этот вывод и чтобы окно не вешалось.
Пробовал через потоки делать, но что-то не очень получается.
PM MAIL   Вверх
Fitc
Дата 20.10.2011, 21:13 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.1.2010

Репутация: 3
Всего: 4



BackgroundWorker смотри, тема заезжена, мог бы и погуглить
PM MAIL   Вверх
igsilya
Дата 20.10.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Я делал бэкграунд воркера, и интернет лопатил. Проблема в том, что  нужно ещё изредка выдавать диалоговые окна из этого потока. Для этого их необходимо вызывать от имени основного потока GUI => снова та же проблема.

Код

namespace NameSpace
{
    public partial class Form1 : Form
    {

        void Выполнить_Мега_Адскую_И_Долгую_Работу()
       {
          .................................
          if (FolderDialog.ShowDialog() == DialogResult.OK)
                    {
                    ........................
       }   
        
        private void Button1_Click(object sender, EventArgs e)
        {
                         Выполнить_Мега_Адскую_И_Долгую_Работу();
        }
    
    }
}




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

Код

 void Выполнить()
       {
            if (this.InvokeRequired)
            {
                Invoke(new MethodInvoker(delegate() { Выполнить(); }));
            }
            else
            {
                ....................
            }
        } 


всё опять виснет

Это сообщение отредактировал(а) igsilya - 20.10.2011, 21:54
PM MAIL   Вверх
Ky7m
Дата 21.10.2011, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 8.4.2008

Репутация: 1
Всего: 2



А может поменять логику работы программы. Почему пока не идет работа показать прогресс бар, а потом когда все данные расчитаются, то и заполните все поля, тем более для этого с использованием Worker не понадобится решать кросспотоковые проблемы.
PM MAIL ICQ   Вверх
igsilya
Дата 21.10.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



слишком большая программа, буду несколько дней переделывать логику.
PM MAIL   Вверх
boevik
Дата 21.10.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Поставить Application.DoEvents() для обработки событий от пользователей и перерисовки формы.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
igsilya
Дата 22.10.2011, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boevik @ 21.10.2011,  22:23)
Поставить Application.DoEvents() для обработки событий от пользователей и перерисовки формы.

Спасибо, не знал об этой функции. Очень помогло.

Это сообщение отредактировал(а) igsilya - 22.10.2011, 01:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.