Jump to content

Recommended Posts

Posted

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?

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

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.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

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)

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

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


Luis Lourenço

Posted

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

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

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. 😛 Ainda assim, obrigado Dotinho pela ajuda 🙂 Comecei à pouco tempo a usar threads, e ainda não dei conta destes pequenos pormenores.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.