.Net не отвечает, Application.DoEvents и Threading - PullRequest
2 голосов
/ 08 марта 2009

Мое приложение mdi VB.Net выполняет длительную операцию с некоторыми данными. В идеале я должен использовать отдельный поток, чтобы предотвратить страшное сообщение «Не отвечает».

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

Есть ли какой-нибудь способ запретить всем окнам mdi, панелям инструментов и другим элементам управления получать щелчки мыши и ввод с клавиатуры во время работы моего фонового потока?

Или есть способ очистить очередь сообщений перед выполнением Application.DoEvents?

Спасибо

Ответы [ 5 ]

4 голосов
/ 08 марта 2009

Я бы сказал, что лучший выбор, когда вы не хотите, чтобы пользователь нажимал на элемент управления, это установить для параметра Enabled значение False для этого элемента управления.

РАЗЪЯСНЕНИЕ: установка «Разрешено» на «Ложь» для родительского элемента управления также отключит все дочерние элементы. Так что, установив Enabled в False в главном окне и окнах MDI, добьемся цели.

2 голосов
/ 08 марта 2009

Есть несколько способов отключить элементы управления, но я не уверен, что вы этого хотите.

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

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

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

0 голосов
/ 08 марта 2009

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

Модальное диалоговое окно автоматически запрещает ввод (возможно, родителем должно быть само окно mdi.)

(Пожалуйста, не используйте взломы, такие как скрытие или отключение элементов управления или окон. И, пожалуйста, пожалуйста! Не используйте DoEvents.)

0 голосов
/ 08 марта 2009

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

List<Control> lstControls = GetAllControls(this.Controls);

                foreach (Control ctrl in lstControls)
                {
                if (ctrl.GetType().Name.ToLower().Contains("progressbar")                     {
                        ctrl.Enabled = true;
                    }
                    else
                    {
                        ctrl.Enabled = false;
                    }
                }
0 голосов
/ 08 марта 2009

Скрыть все формы и показать только одну основную форму. Затем отключите панель инструментов / меню, если у вас есть. Затем создайте строку состояния с индикатором выполнения, и когда это будет сделано, откройте форму, над которой работал пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...