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

softklin

Abrir um form a meio de uma thread

10 mensagens neste tópico

Boas.

Estou a fazer um pequeno programa que tem por objectivo abrir determinados programa ao carregar em teclas. Uma função que queria implementar era um On-Screen Display, ou seja, aquelas letras, por exemplo, quando mudamos de canal no televisor, normalmente verdes. Já fiz um form dedicado a isso, e funciona muito bem, em termos de texto e posicionamento. Mas tenho um pequeno problema:

Estou a tentar abrir esse form numa thread, que está sempre a procurar novas teclas. Vou dar mais ou menos o aspecto a coisa:

form principal

Dim buffer As String = ""
While True
  If comPort.BytesToRead > 0 Then
    buffer = comPort.ReadLine()
    If keymaps.ContainsKey(buffer) Then
      System.Diagnostics.Process.Start(keymaps(buffer)(1))
      ' Aqui é onde estou a tentar abrir o tal form OSD, mas não dá 
    End If
  End If
End While

Já tentei abrir directamente, numa thread, mas tudo o que obtenho é um form a preto, ou não aparece form. O código que tenho a inicializar o tal form onde mostro o texto:

form OSD

Me.Show()
time = New Timer()
time.Interval = 4000
time.Start()

lblText.Left = 0
lblText.Top = 0
Me.Width = lblText.Width
Me.Height = lblText.Height
Me.Top = My.Computer.Screen.WorkingArea.Height - Me.Height
Me.Left = My.Computer.Screen.WorkingArea.Width / 2 - (Me.Width / 2)

No tick do timer tenho um simples Me.close()

Alguma sugestão?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa mas não entendi bem o teu problema..

Tens problemas ao fechar o OSD ou ao abri-lo? ou na mostragem dele?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho problemas ao abrir o formulário do OSD e mostrá-lo. Tentei abrir com uma thread e ainda com a declaração do form (dim f as new frmOSD()) mas deu ou o form todo a preto, ou não aparecia. O sítio onde tentei abrir é onde tenho o comentário.

Esqueci-me de dizer, aquele while true por si só já está a correr numa thread. O que queria era abrir o tal form quando a tecla fosse capturada, para fazer o tal efeito dos OSD's.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por acaso já tinha essa opção. Quer a active ou não, não dá o efeito que desejava (abrir o form). Parece que o código while true ... bloqueia a abertura do form...

EDIT: fiz agora umas experiências com o Debug, e o form na realidade abre, mas não chega a cumprir os 4 segundos que defini para o timer. Será que a thread é encerrada no código principal (numa nova iteração do ciclo)? Como posso prevenir isso? (A variável da thread está declarada para toda a classe, não é local)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo tenta num thread difierente:

Dim UmaVez as Boolean = False: Dim IntCont as integer=0
While True
  If comPort.BytesToRead > 0 Then
    buffer = comPort.ReadLine()
    If keymaps.ContainsKey(buffer) Then
      'System.Diagnostics.Process.Start(keymaps(buffer)(1))
    if Not UmaVez then
          ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ABrirOSD))
           UmaVez=True: IntCont=0
    End If
      ' Aqui é onde estou a tentar abrir o tal form OSD, mas não dá 
    End If:  End If

   if UmaVez Then
   intcont +=1: End If

   If UmaVes and IntCont >400 Then
   UmaVez=False: IntCont=0 :End If

    Thread.Sleep(100)



Private Sub AbrirOSD()
dim s as new form() ' a form OSD
s.show
End Sub

e na form OSD é lá que poes o timer do tipo:

Private WithEvents t4s As New Timers.Timer With {.Interval = 4000, .AutoReset = False, .Enabled = True}

    Private Sub Sair() Handles t4s.Elapsed
        Me.Close()
    End Sub


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

comport é uma variável de uma porta de série, da qual recebo os dados.

Não consegui perceber bem as variáveis de contagem e umaVez, qual é a ideia ao utilizá-las? De qualquer maneira, tentei executar numa outra thread, com e sem sleep, mas sem sucesso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já consegui resolver. O problema era o pedaço de código que abre o form estava definido assim:

Dim dialog as new frmOSD()
frmOSD.show()

mas desta forma, quando o formulário fosse aberto, não havia mais instruções para carregar e a thread acabava, fechando o form prematuramente. Basta fazer com que a thread "pendure" na abertura do form, esperando alguma resposta do mesmo, por exemplo, a situação de um modalDialog:

Dim osd As New frmOSD()
Dim dlgResult As DialogResult = osd.ShowDialog()

Desta maneira, o código irá permanecer na segunda linha, até que seja fechado por acção do timer. :P Ainda assim, obrigado Dotinho pela ajuda :) Comecei à pouco tempo a usar threads, e ainda não dei conta destes pequenos pormenores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito bem :)

Se não formos nos a tratar de loopings, a threads acabam o processo sem nos saber-mos..

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