Сохраняйте формы приложения windows внутри приложения и блокируйте запуск других форм, уже открыв одну форму - PullRequest
0 голосов
/ 23 марта 2020

У меня есть приложение (vb. net версия 4.0). При запуске команды из приложения появится форма windows с надписью «Пожалуйста, подождите, пока операция не закончится». Даже если я сверну все приложение и перейду к текстовому приложению. Это всплывающее окно не свернуто.

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

Form.ShowDialog()
Form1.Activate()
Form1.BringToFront()
Form1.TopMost = True

Впервые на vb. net. Помощь высоко ценится

1 Ответ

1 голос
/ 23 марта 2020

Для вашей первой проблемы это звучит так, как будто вы выполняете какую-то долгую операцию, используя поток, который запускает aws пользовательский интерфейс, не позволяя ему выполнять свою работу по обновлению пользовательского интерфейса. Когда это происходит, Windows ОС покажет сообщение, если обнаружит, что операция не отвечает.

Внутренний способ работы windows заключается в том, что у него есть очередь для вашего приложения, в которую он отправляет сообщения для таких вещей, как команда рисования окна, нажатия кнопки мыши и нажатия клавиш и т. Д. c. Основной поток, запустивший ваше приложение, выполняет задачу по потреблению этой очереди и ее уменьшению. Если вы что-то делаете (допустим, вы начинаете вычислять число Пи до 3 квадриллионов) в обработчике событий нажатия кнопки, то основной поток больше не сможет получать сообщения из очереди windows. Windows замечает, что очередь становится все длиннее и длиннее, и показывает сообщение «это приложение не отвечает».

Этого можно избежать, НЕ выполняя длинные операции в потоке windows или используя какой-либо асинхронный / многопоточный режим для выполнения вашей длинной операции, которая позволит основному потоку go вернуться к его работа с windows очередью сообщений


Для вашего второго запроса это кажется разумным:

Когда вы используете ShowDialog(), выполнение этого кода приостанавливается в точке ShowDialog вызывается и продолжается только в том случае, если форма, открытая с помощью ShowDialog (), закрыта

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

В вашем коде, пока Form не будет закрыт, Form1.Activate() не случится. Как только форма закроется, остальные 3 оператора будут называться

Обратите внимание, что если форма запускает длительную операцию, то это также вызовет проблему «приложение не отвечает»

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