Моя Цель
Я хотел бы, чтобы основной поток обработки (без графического интерфейса), и уметь крутиться ГПИ в собственных фоновых потоков по мере необходимости, и у моего основного номера графического потока продолжать работать. Иными словами, Я хочу, чтобы моя главная номера с GUI-поток, чтобы быть владельцем графического потока, а не наоборот. Я'м не уверен, что это вообще возможно с Windows форм(?)
Фон
У меня есть компонент системы, в котором контроллер динамически загружать сборки и создает и запустить классах, реализующих интерфейс общий интерфейс icomponent с один метод DoStuff()`.
Какие компоненты, которая загружается настраивается через XML-файл конфигурации и добавления новых сборок, содержащих различные реализации интерфейс icomponent
. Компонентов обеспечивает вспомогательные функции для основного приложения. В то время как основная программа делает это'ы что, например, управления атомной станции, компоненты могут быть выполнение коммунальных задач (в отдельных потоках), например, при очистке базы данных, отправка электронной почты, печать смешные анекдоты на принтере, что там у вас. Что я хотел бы, чтобы один из этих компонентов способен отображать графический интерфейс, например, с информацией о состоянии сообщил об отправке составляющая электронной почты.
Срок службы всей системы выглядит так
DoStuff ()
, чтобы инициализировать его и заставить его жить своей жизнью в собственные потоки.Я еще не был в состоянии успешно выполнить пункт 3, если компонент запускает GUI в DoStuff()
. Он просто останавливается, пока окно закроется. И не до тех пор, пока окно закроется, программа прогрессировать до точки 4.
Было бы здорово, если бы эти компоненты были разрешены, чтобы начать свой собственный форм Windows ГПИ.
Проблема
Когда компонент пытается создать графическое приложение в DoStuff()(точные строки кода, когда приложение запускается компонент
.Запустить(формы)`), компонента и, следовательно, наши системы "зависает" и в приложении.Запуск линии () до тех пор, пока окно закроется. Ну, просто загорелся GUI работает нормально, как и ожидалось.
Пример компоненты. Еще'т ничего общего с GUI, в то время как второй закуривает милые окна с розовыми пушистыми зайчиками в них.
public class MyComponent1: IComponent
{
public string DoStuff(...) { // write something to the database }
}
public class MyComponent2: IComponent
{
public void DoStuff()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
// I want the thread to immediately return after the GUI
// is fired up, so that my main thread can continue to work.
}
}
Я попытался это с не повезло. Даже когда я пытаюсь запустить GUI в это'собственного резьбы s, выполнение останавливается до тех пор, пока GUI как закрытые.
public void DoStuff()
{
new Thread(ThreadedInitialize).Start()
}
private void ThreadedInitialize()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
Можно ли закрутить GUI и возвращение после применения.Выполнить()`?
Приложение.Запустите метод выводит один (или более) форм и запускает стандартный цикл обработки сообщений, который работает, пока все формы не будут закрыты. Вы не можете силой заставить вернуть из этого метода, кроме закрытия всех форм или принудительной остановки приложения.
Однако вы можете пройти ApplicationContext (вместо внесения новой форме()) в приложение.Метод run и ApplicationContext может быть использован для запуска нескольких формах сразу. Ваше приложение будет только конец, когда все они закрыты. Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx
Кроме того, любые формы, которые вам показывают, не модально будет продолжать работать параллельно с вашей основной форме, который позволит вам иметь больше одного окна, которые не блокируют друг друга. Я считаю, что это на самом деле то, что вы пытаетесь достичь.
Я'м уверена, что это возможно, если вы взломать его достаточно трудно, но я'd в том, что это не очень хорошая идея.
'окна' (что вы видите на экране) тесно связаны с процессами. То есть каждый процесс, который отображает любой графический предполагается цикл обработки сообщений, который обрабатывает все сообщения, которые связаны с созданием и управление окнами (такие вещи, как 'нажал кнопку', 'в приложении', 'перерисовки экрана' и так далее.
Из-за этого, он более или менее предположить, что если у вас есть цикл обработки сообщений, она должна быть доступна в течение всего времени жизни процесса. Например, Windows может отправить вам 'ушел' сообщение, и вы должны иметь цикл обработки сообщений для обработки, что, даже если вы've получили ничего на экране.
Лучше всего делать это так:
Сделать поддельный бланк, который никогда не показывается что ваш 'работает' Запуск Вызов Приложения.Бегут и передают в фальшивую форму. Делай свою работу в другом потоке, и пожары в главный поток, когда нужно сделать графический материал.
Я'м не уверен, если это правильно, однако я помню, как работает окно из консольного приложения, просто представления о форме и называть newForm.Показать() на нем, если компоненты использовать, что вместо приложения.Запустить (), то новая форма должна'т блок.
Конечно, этот компонент будет отвечать за сохранение ссылки на формы, которые оно создает