• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

Form que não abre correctamente

11 mensagens neste tópico

Estou aqui com um problema e não consigo compreender de onde vem.

É o seguinte, tenho uma form que abre (a 1ª) nela tenho o código de servidor socket a correr em Backgroundworker, nesse código tenho uma chamada a um Public Sub "parser" que serve para interpretar o que chega pelo socket e aplicar conforme o que recebe este Public Sub está noutro ficheiro um "Module Functions" onde tenho também outras funções, até aqui tudo bem, envio qualquer string por socket e recebe com sucesso é interpretada pelo parser, mas surgiu um problema eu estava a criar um form que seria aberto (frmTeste123.Show) quando o comando teste123 fosse recebido pela socket, mas quando recebe esse comando ele abre a form mas fica toa branca e se lhe clicar com o rato aparece logo "- Não Responde", não dá erro nenhum, não tenho nenhum warning e mais, para tirar as teimas coloquei esse tal form a ser aberto no evento LOAD do form principal (não são MDI Forms, são forms normais) e abre bem sem problemas nenhums.

:wallbash:

Já estou com o cérebro em papa. Não se pode abrir um from através de um Public SUB num modulo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes abrir forms através de módulos sim.

O problema que tens aí tem provavelmente algo a haver com o backgroundworker.

Exprimenta, ao invés de abrires o form como o deves estar a abrir (nome.show), criares uma instância do form. Isso já é "thread safe". Não mete dois threads ao barulho.

Dim F As New frmTeste123
F.Show

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu cheguei a testar isso mas com o mesmo resultado. Testei agora através desse método colocando no LOAD do form inicial e abre sem problemas (mais uma vez), fazendo copy paste para o "Public Sub parser" no Module já não funciona.

Coloquei código para verificar se o form estava a abrir mais que uma vez ou algo do género mas está tudo ok.

Não percebo mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já exprimentaste meter isso dentro do bgw, só a título de teste?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já exprimentaste meter isso dentro do bgw, só a título de teste?

O resultado é o mesmo, não percebo.

A form fica toda branca, com o cursor do rato como "Ocupado" ou seja a ampulheta (XP) ou aquele circulo (Vista), e ainda mais estranho (para mim) é que se clicar no botão de fechar dessa form ele fecha a aplicação toda, mesmo estando nas propriedades do projecto que só termina quando a form inicial for fechada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que há no form_load da form a abrir?

Private Sub frmKillOASMgp_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Application.DoEvents() 'Apenas coloquei isto a ver se resolvia o problema...
        countdown.Start() 'Inicia um timer do form
End Sub

Mas lá está, eu se fizer Show ao form apartir do evento load do inicial ele abre e funciona bem, só não funciona quando é chamado através do parser / socket

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se comentares isso tudo, a form abre? (com o método de instanciação)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se comentares isso tudo, a form abre? (com o método de instanciação)

Não, acontece o mesmo que acontecia antes, ou seja o problema não é da Form

Inclusivé meti um "break" no Evento Tick do timer e não chega a passar lá....o form crasha mal é aberto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui resolver, o problema estava em o BackgroundWorker estar a enviar "info" sem ser pelo método "normal"

Mandei assim a info para o parser e já funcionou 5*

'No código do servidor (dentro do BackgroundWorker_Dowork)
bkgServer.ReportProgress(100, socket_data)

Private Sub bkgServer_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bkgServer.ProgressChanged
        parser(e.UserState)
End Sub

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo o que percebi o backgroundworker é que chama a função que vai abrir o form certo?

Se estás a fazer isto é normal, pois o form vai ser aberto na mesma threath que o backgroundworker e claro, vai-te bloquear o form.

Para poderes abrir o form correctamente tens que activar a propriedade .WorkerReportsProgress para poderes enviar eventos para fora sem bloquear.

Quando queres abrir esse form basta executares a função .ReportProgress que vai activar o evento ProgressChange. Depois basta mandares abrir o form neste evento e tens o problema resolvido.

Acabei de testar e desta forma já funcionou

EDIT: ou mandares efectuar o parser pelo report progress como fizes-te e bem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora