от
Моя Цель Я хотел бы, чтобы основной поток обработки (без графического интерфейса), и уметь крутиться ГПИ в собственных фоновых потоков по мере необходимости, и у моего основного номера графического потока продолжать работать. Иными словами, Я хочу, чтобы моя главная номера с GUI-поток, чтобы быть владельцем графического потока, а не наоборот. Я не уверен, что это вообще возможно с Windows форм(?) Фон У меня есть компонент системы, в котором контроллер динамически загружать сборки и создает и запустить классах, реализующих общий интерфейс
IComponent
с одним методом
DoStuff()
. Какие компоненты, которая загружается настраивается через XML-файл конфигурации и добавления новых сборок, содержащих различные реализации
IComponent
. Компонентов обеспечивает вспомогательные функции для основного приложения. В то время как основная программа делает это дело, например, управления атомной станции, компоненты могут быть выполнение коммунальных задач (в отдельных потоках), например, при очистке базы данных, отправка электронной почты, печать смешные анекдоты на принтере, что там у вас. Что я хотел бы, чтобы один из этих компонентов способен отображать графический интерфейс, например, с информацией о состоянии сообщил об отправке составляющая электронной почты. Срок службы всей системы выглядит так Начинается приложение. Проверьте файл конфигурации для компоненты для загрузки. Загружать их. Для каждого компонента, достаточно запустить
DoStuff()
, чтобы инициализировать его и заставить его жить своей жизнью в собственные потоки. Продолжать делать основное применение-штука царем работать, навсегда. Я еще не в состоянии успешно выполнить пункт 3, если компонент запускает GUI в
DoStuff()
. Он просто останавливается, пока окно закроется. И не до тех пор, пока окно закроется, программа прогрессировать до точки 4. Было бы здорово, если бы эти компоненты были разрешены, чтобы начать свой собственный форм Windows ГПИ. Проблема Когда компонент пытается запустить GUI в
DoStuff()
(точные строки кода, когда компонент работает
Application.Run(theForm)
), компонента и, следовательно, наша система "зависает" на линии
Application.Run()
, пока окно закроется. Ну, просто загорелся 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 в его собственном потоке, выполнение останавливается до тех пор, пока GUI как закрытые.
public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}
Можно ли закрутить GUI и вернуться после
Application.Run()
?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

4 Ответы

0 голосов
от
Моя Цель Я хотел бы, чтобы основной поток обработки (без графического интерфейса), и уметь крутиться ГПИ в собственных фоновых потоков по мере необходимости, и у моего основного номера графического потока продолжать работать. Иными словами, Я хочу, чтобы моя главная номера с GUI-поток, чтобы быть владельцем графического потока, а не наоборот. Я не уверен, что это вообще возможно с Windows форм(?) Фон У меня есть компонент системы, в котором контроллер динамически загружать сборки и создает и запустить классах, реализующих общий интерфейс
IComponent
с одним методом
DoStuff()
. Какие компоненты, которая загружается настраивается через XML-файл конфигурации и добавления новых сборок, содержащих различные реализации
IComponent
. Компонентов обеспечивает вспомогательные функции для основного приложения. В то время как основная программа делает это дело, например, управления атомной станции, компоненты могут быть выполнение коммунальных задач (в отдельных потоках), например, при очистке базы данных, отправка электронной почты, печать смешные анекдоты на принтере, что там у вас. Что я хотел бы, чтобы один из этих компонентов способен отображать графический интерфейс, например, с информацией о состоянии сообщил об отправке составляющая электронной почты. Срок службы всей системы выглядит так Начинается приложение. Проверьте файл конфигурации для компоненты для загрузки. Загружать их. Для каждого компонента, достаточно запустить
DoStuff()
, чтобы инициализировать его и заставить его жить своей жизнью в собственные потоки. Продолжать делать основное применение-штука царем работать, навсегда. Я еще не в состоянии успешно выполнить пункт 3, если компонент запускает GUI в
DoStuff()
. Он просто останавливается, пока окно закроется. И не до тех пор, пока окно закроется, программа прогрессировать до точки 4. Было бы здорово, если бы эти компоненты были разрешены, чтобы начать свой собственный форм Windows ГПИ. Проблема Когда компонент пытается запустить GUI в
DoStuff()
(точные строки кода, когда компонент работает
Application.Run(theForm)
), компонента и, следовательно, наша система "зависает" на линии
Application.Run()
, пока окно закроется. Ну, просто загорелся 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 в его собственном потоке, выполнение останавливается до тех пор, пока GUI как закрытые.
public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}
Можно ли закрутить GUI и вернуться после
Application.Run()
?
0 голосов
от
Приложения.Метод run отображает одну (или более) форм и запускает стандартный цикл обработки сообщений, который работает, пока все формы не будут закрыты. Вы не можете силой заставить вернуть из этого метода, кроме закрытия всех форм или принудительной остановки приложения. Однако вы можете пройти ApplicationContext (вместо внесения новой форме()) в приложение.Метод run и ApplicationContext может быть использован для запуска нескольких формах сразу. Ваше приложение будет только конец, когда все они закрыты. Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx Кроме того, любые формы, которые вам показывают, не модально будет продолжать работать параллельно с вашей основной форме, который позволит вам иметь больше одного окна, которые не блокируют друг друга. Я считаю, что это на самом деле то, что вы пытаетесь достичь.
0 голосов
от
Я уверен, что это возможно, если вы взломать его достаточно сложно, но я предлагаю это не очень хорошая идея. "Окна" (которые вы видите на экране) тесно связаны с процессами. То есть каждый процесс, который отображает любой графический предполагается цикл обработки сообщений, который обрабатывает все сообщения, которые связаны с созданием и управление окнами (такие вещи, как 'нажата кнопка', 'закрыть приложение', 'перерисовки экрана и так далее. Из-за этого, он более или менее предположить, что если у вас есть цикл обработки сообщений, она должна быть доступна в течение всего времени жизни процесса. Например, Windows может отправлять вам "закрыть" сообщение, и вы должны иметь цикл обработки сообщений для обработки, что, даже если у тебя ничего нет на экране. Лучше всего делать это так: Сделать поддельный бланк, который никогда не показывается что ваш 'приложение' Запуск Вызов Приложения.Бегут и передают в фальшивую форму. Делай свою работу в другом потоке, и пожары в главный поток, когда нужно сделать графический материал.
0 голосов
от
Я не уверен, если это правильно, однако я помню, как бежала формы окно из консольного приложения, просто представления о форме и называть newForm.Показать() на нем, если компоненты использовать, что вместо приложения.Запустить (), то новая форма не закрывала. Конечно, этот компонент будет отвечать за сохранение ссылки на формы, которые оно создает
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...