Possível "spin off" vários tópicos GUI? (Não travar o sistema em Application.Run)

votos
20

Meu gol

Eu gostaria de ter uma linha de processamento principal (não GUI), e ser capaz de girar fora GUIs em suas próprias fundo tópicos, conforme necessário, e ter meu thread principal não GUI continuar trabalhando. Dito de outra forma, eu quero o meu principal não GUI-thread para ser o proprietário do GUI-thread e não vice-versa. Eu não tenho certeza que isso é mesmo possível com o Windows Forms (?)

fundo

I têm um sistema baseado componente no qual um controlador de carga dinamicamente conjuntos e instancia e executar classes de execução de um comum IComponentde interface com um único método DoStuff().

Quais os componentes que é carregado é configurado por meio de um ficheiro de configuração XML e adicionando novos conjuntos contendo diferentes implementações IComponent. Os componentes fornece funções de utilidade para a aplicação principal. Enquanto o programa principal está fazendo é coisa, por exemplo, controlar uma planta nuclear, os componentes pode ser a realização de tarefas de serviço público (em suas próprias threads), por exemplo, a limpeza do banco de dados, enviar e-mails, imprimir piadas engraçadas na impressora, o que você tem. O que eu gostaria, é ter um desses componentes ser capaz de exibir uma interface gráfica, por exemplo, com informações de status para o referido componente de e-mail de envio.

A vida útil do sistema completo se parece com isso

  1. Aplicativo é iniciado.
  2. Verifique arquivo de configuração para os componentes para carregar. Carregá-los.
  3. Para cada componente, correr DoStuff()para inicializar-lo e torná-lo viver a sua própria vida em suas próprias threads.
  4. Continue a fazer principal aplicação coisinha rei de trabalho, para sempre.

Eu ainda não ter sido capaz de executar com êxito o ponto 3 se o componente é acionado até uma GUI em DoStuff(). Ele simplesmente pára até que o GUI é fechado. E não até que o GUI é fechado faz o programa de progresso para o ponto 4.

Seria ótimo se esses componentes foram autorizados a iniciar GUIs seu próprio Windows Forms.

Problema

Quando um componente tenta disparar uma GUI em DoStuff()(a linha exata do código é quando o componente é executado Application.Run(theForm)), o componente e, portanto, nosso sistema trava no Application.Run()linha até que o GUI é fechado. Bem, a GUI apenas despediu-se funciona bem, como esperado.

Exemplo de componentes. Um não tem nada a ver com GUI, enquanto o segundo incêndios um Windows bonitos com coelhos macios rosa neles.

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.
    }
}

Eu tentei isso sem sorte. Mesmo quando eu tento o fogo até a GUI em seu próprio segmento, a execução é interrompida até que o GUI como fechado.

public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}

É possível cisão de uma GUI e voltar depois Application.Run()?

Publicado 05/08/2008 em 22:19
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Application.Run método exibe um (ou mais) formas e inicia o ciclo de mensagem padrão ou seja, até todas as formas estão fechadas. Você não pode forçar um retorno a partir desse método, exceto fechando todas as suas formas ou forçar um desligamento aplicação.

Você pode, no entanto, passar um ApplicationContext (instad de um novo Form ()) para o método Application.Run e ApplicationContext pode ser usado para lançar várias formas ao mesmo tempo. Sua aplicação só irá terminar quando todos aqueles estão fechados. Veja aqui: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

Além disso, todos os formulários que você mostra não-modal continuará a correr ao lado de seu formulário principal, que vai permitir que você tenha mais de um Windows que não bloqueiam uns aos outros. Eu acredito que este é realmente o que você está tentando realizar.

Respondeu 05/08/2008 em 22:45
fonte usuário

votos
0

Eu não tenho certeza se isso é certo, no entanto Lembro-me de correr formas janela de um aplicativo console por apenas Newing a forma e chamando newForm.Show () sobre ele, se os seus componentes usar que em vez de Application.Run (), em seguida, o novo formulário não deve bloquear.

É claro que o componente será responsável pela manutenção de uma referência às formas que cria

Respondeu 23/05/2009 em 22:57
fonte usuário

votos
0

Tenho certeza que isso é possível se você cortar em que é difícil o suficiente, mas eu sugiro que não é uma boa idéia.

'Windows' (que você vê na tela) são altamente acoplado a processos. Ou seja, cada processo que exibe qualquer GUI deverá ter um loop de mensagem, que processa todas as mensagens que estão envolvidos com a criação e gerenciamento de janelas (coisas como 'clicou no botão', 'fechou o aplicativo', 'redesenhar a tela ' e assim por diante.

Devido a isso, ele é mais ou menos assumido que se você tiver qualquer loop de mensagem, ela deve estar disponível para a vida do seu processo. Por exemplo, o Windows pode enviar-lhe uma mensagem de 'sair', e você precisa ter um loop de mensagem disponíveis para lidar com isso, mesmo se você não tem nada na tela.

Sua melhor aposta é fazê-lo como este:

Faça uma forma falso que nunca é mostrado que é seu 'aplicativo principal' Start up Chamada Application.Run e passar nesta forma falso. Fazer o seu trabalho em outro segmento, e eventos de incêndio no thread principal quando você precisa fazer coisas Gui.

Respondeu 06/08/2008 em 00:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more