Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
sagal
1 / 1 / 3
Регистрация: 26.10.2013
Сообщений: 35
#1

Форма и контролы неактивны при исполнении потока - C#

15.10.2015, 15:21. Просмотров 210. Ответов 4
Метки нет (Все метки)

Уважаемые форумчане!
Может, кто подскажет -что не так?
На форме две кнопки и dataGridView.
dataGridView загружается из базы.
Сделал загрузку dataGridView из отдельного потока - работает, но форма и кнопки пока dataGridView и форматируется неактивны - с ними ничего нельзя сделать.
Вроде, если работает новый поток, то кнопки и форма должны быть доступны.
Что не так?
Использую:
Код
Thread thread = new Thread("загрузить dataGridView из базы и отформатировать ");
thread.Start();

http://www.cyberforum.ru/windows-forms/thread671748.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2015, 15:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Форма и контролы неактивны при исполнении потока (C#):

Как сделать, чтобы форма и контролы на ней во время долгих расчётов не зависали?
Как сделать чтобы форма и контролы на ней во время долгих расчётов не зависали?

Ошибка sql при исполнении.
Main.cs при выполнении выдает ошибку на строках 52-55 Подскажите как это...

Форма не прорисовывается до конца, если была вызвана из другого потока
У меня небольшая проблема, я подозреваю, что проблема с межпотоковой...

Добавление записи в Listview(1 форма) через Диалоговое окно(3 форма) другой формы (2 форма)
Всем доброго дня и с наступающими праздниками! Знаю, тема 7 частых вопросов...

Форма 1 вызывает форму 2, форма 2 закрывается, форма 1 продолжает работать дальше
Вынес предстартовые действия формы1 в форму2 (там у меня проверка существования...

4
Rius
Эксперт .NET
4540 / 2854 / 699
Регистрация: 25.05.2015
Сообщений: 8,813
Записей в блоге: 10
Завершенные тесты: 4
15.10.2015, 15:34 #2
Что не так: из потока нельзя обращаться к контролам напрямую.
0
sagal
1 / 1 / 3
Регистрация: 26.10.2013
Сообщений: 35
15.10.2015, 15:42  [ТС] #3
Дело в том, что поток работает, но блокирует все, пока dataGridView не загрузится.

К формам обращаюсь через:
Код
Action act=()=>{/*код заполнения  dataGridView*/};

Invoke(act);
Все работает, но почему во время заполнения не активны кнопки и форма?
0
Storm23
Эксперт .NETАвтор FAQ
5906 / 3504 / 1307
Регистрация: 11.01.2015
Сообщений: 4,616
Записей в блоге: 31
15.10.2015, 15:47 #4
Цитата Сообщение от sagal Посмотреть сообщение
Все работает, но почему во время заполнения не активны кнопки и форма?
Потому вы вызываете свой act внутри Invoke. Но Invoke выполняет act в главном потоке, в этом его и смысл. Естественно, при этом остальной интерфейс висит.
0
sagal
1 / 1 / 3
Регистрация: 26.10.2013
Сообщений: 35
15.10.2015, 17:44  [ТС] #5
А что надо сделать, чтобы такого не было?

Добавлено через 8 минут
Извините, вопрос поставил некорректно:

Возможно ли в принципе загружать и форматировать DataGridView в отдельном потоке, и чтобы в это время ничего не зависало?

Добавлено через 1 час 1 минуту
Вот, сделал на форме с двумя кнопками и textbox-сом, в котором новый поток отсчитывает до определенной цифры.
В это время ничего не зависает - можно таскать форму, нажимать на кнопки и т.д.
Правда, добавил класс.
Но как это применить чтобы также ничего не зависало, если вместо textbox я из базы загружаю DataGridView?

Пример:
Класс
Код
using System.Threading;

namespace proThread
{
   public class Tclass
    {
       public event Action<int> MyCount;

       public void Schet()
       {
           for (int i = 0; i < 100; i++)
           {
               Thread.Sleep(50);
               MyCount(i);
           }
       }

    }
}
Форма
Код
using System.Threading;

namespace proThread
{
    public partial class Form1 : Form
    {
        private Tclass tcl = new Tclass();
        Thread thread;
        public Form1()
        {
            InitializeComponent();
        }

        private void butStart_Click(object sender, EventArgs e)

        {
            tcl = new Tclass();
            tcl.MyCount += Write;
             thread = new Thread(tcl.Schet);
            thread.Start();
        }

        private void Write(int number)
        {
            Action act = () =>
            {
                textBox1.Clear();
                textBox1.AppendText(Convert.ToString(number));
            };
            if (InvokeRequired)
            { Invoke(act); }
            else { act(); }

        }

        private void butStop_Click(object sender, EventArgs e)
        {
            thread.Abort();
        }
    }
}
Как так же сделать с загрузкой DataGridView из базы и ее форматированием чтобы форма не тормозила?
0
15.10.2015, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2015, 17:44
Привет! Вот еще темы с решениями:

Форма отказывается двигаться при изменении this.Location при ее инициализации
В кратце. Я пытаюсь изменить свойство this.Location у формы во время её...

Зависает форма при создании потока
Здравствуйте форумчане. Вчера тестировал работу 200 одновременных потоков...

Форма не обновляется при запуске второго потока
Есть следующий код: public void Upd(){ l=new Ping(); thr=new Thread(l);...

Как сделать при событии один пункт активным, а все остальные неактивны при условии что это общая функция
Вот к примеру: http://jsbin.com/uhiqap/1/edit на галерею когда клацаешь -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru