Pergunta

Existe alguma maneira de processar todas as mensagens do Windows, enquanto o segmento interface do usuário está aguardando um WaitHandle ou outra segmentação primitiva?

Eu percebo que isso poderia criar problemas reentrancy muito confuso; Eu quero fazê-lo de qualquer maneira.

Editar : A espera ocorre no meio de uma função complicada que deve ser executado no segmento. Portanto, movendo-se o tempo de espera para uma discussão de fundo não é uma opção. (Splitting a função em dois faria uma bagunça complicada e insustentável)

Foi útil?

Solução

Eu correria toda a "função complicada que-pode-não-ser-split" em uma discussão de fundo separado, e tê-lo a informar o GUI apenas quando ele precisa (usando métodos Invoke / BeginInvoke em um controlo).

Em uma versão mais avançada, você deve executar a função complicada em um controlador não-UI que não dependem da UI, e é mais fácil de teste de unidade. Chamando de volta para a interface do usuário e mostrar o resultado na interface do usuário, pode ser facilmente alcançado por ter a interface do usuário para subrscribe para eventos disponibilizados pelo controlador.

Outras dicas

Por que você não apenas gerar outro segmento para fazer a espera e ter-lhe notificar o segmento interface do usuário através de uma mensagem (ou qualquer outro) no momento oportuno?

Essa é a abordagem usual para permitir UI mensagem manipulação fio durante um evento de bloqueio.

EDIT: Vejo agora - você tem essa lógica lógica aplicativo embutido no código UI. Bem, este é realmente um problema de design então. Você é melhor fora a longo prazo quebrar essa funcionalidade a partir da interface do usuário em um objeto independente e utilizando algum mecanismo para comunicar o estado com a interface do usuário do seu trabalhador.

Além do benefício de manter seu código UI focada na interface do usuário, isso permite que você unidade-teste o código lógica separadamente.

Não tenho certeza C #, mas em programação Win32 simples, você pode usar um dos MsgWaitFor ... () funções para a espera real. Ele irá notificá-lo quando as mensagens estão presentes na fila de mensagens, bem como quando o objeto (s) ser esperou tornar-se sinalizado. Se ele relata uma mensagem está presente, você pode chamar GetMessage (), TranslateMessage () e DispatchMessage () para processar uma mensagem, e depois voltar a esperar.

Eu normalmente recomendo colocar a sua condição de espera em outro segmento.

No entanto, dito isto, você pode sempre chamar Application.DoEvents para processar a bomba de mensagem, em qualquer ponto, inclusive enquanto 'espera' em um identificador de espera (apenas tempo limite, fazer eventos, espera com tempo limite, etc, até chegar 'através' do WaitHandle) .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top