C #, Windows Forms и Application.Run () - PullRequest
0 голосов
/ 01 апреля 2010

когда я вызываю Application.Run () для формы, эта команда останавливает программу до тех пор, пока форма не будет закрыта. Есть ли другая команда, которую я могу использовать, чтобы создать форму, не останавливая программу? Спасибо

Ответы [ 6 ]

9 голосов
/ 01 апреля 2010

Когда вы звоните Run, программа не останавливается. Он передает управление в основной цикл сообщений Windows Forms. Любой дополнительный код, который вы хотите выполнить, должен выполняться либо в отдельном потоке, либо в обработчиках событий, таких как Form_Load.

2 голосов
/ 01 апреля 2010

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

Я бы сделал библиотечный проект, который выполняет всю работу IRC в своем собственном потоке. Когда сообщение получено, запустите его. Затем укажите методы отправки сообщений.

Затем создайте проект WinForm, который ссылается на библиотеку IRC. Попросите форму сделать ссылку на экземпляр класса, который вы создали, и зарегистрировать все события. Затем, когда форме необходимо отправить сообщение, она просто вызывает метод SendMessage. Всякий раз, когда происходит событие, IRC-форма получает его и правильно отображает информацию (например, помещает правильное сообщение на нужную вкладку комнаты чата, в журнал сервера или что-то еще).

Делая это таким образом, вы сможете очень легко подключиться к нескольким серверам, поскольку это делает IRC очень многократно используемым. Кроме того, WinForm работает так, как и должно быть, и вам не нужно его взламывать.

2 голосов
/ 01 апреля 2010
myForm F = new myForm();
F.Show();
1 голос
/ 01 апреля 2010

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

МожетВы объясняете, почему вы хотите продолжать обработку?Возможно, вам лучше было бы раскрутить рабочий поток, чтобы выполнять фоновые задачи, а не использовать основной поток.

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

С точки зрения Windows, ваша основная форма - это, по сути, ваше приложение.Вызов Application.Run инициирует цикл сообщений Windows , который обрабатывает и отправляет сообщения между приложением и операционной системой.Это «основной цикл» программы, и здесь выполняется вся обработка пользовательского интерфейса.

Как правило, вы не хотите связываться с циклом сообщений, если у вас нет задач, которые необходимоиметь место постоянно - вы хотите, чтобы они занимали 100% ЦП, если это возможно.(Хорошим примером является цикл симуляции и рендеринга в компьютерной игре; обычно вы хотите, чтобы он отображал обновления как можно быстрее, используя все ресурсы компьютера.)

В вашем случае, что выВас интересует фоновая обработка сообщений, процесс, который не зависит от пользовательского интерфейса и должен работать до тех пор, пока приложение работает.Это хороший кандидат для рабочего потока , который будет порождаться приложением во время процесса инициализации.В то время как модель разделения «пурист» может предложить включить это раскручивание в функцию main () вашего приложения, я бы посоветовал вам рассматривать ваше главное событие Form_Load как «главное» для всех намерений и целей.Вы можете создать класс менеджера связи и инициализировать его в фоновом потоке во время события Load, позволяя ему обрабатывать данные в фоновом режиме и сигнализировать о событиях для пользовательского интерфейса для ответа.

0 голосов
/ 01 апреля 2010

Код будет полезен здесь, пожалуйста. Обычно вызов Application.Run () генерируется Visual Studio при запуске проекта windows.forms в файле program.cs. Вам не нужно никуда звонить.

Если это не ваша проблема, возможно, в вашей форме есть код с ошибкой зацикливания.

0 голосов
/ 01 апреля 2010

Это покажет форму без остановки программы

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