softklin Posted August 20, 2009 at 09:28 AM Report #283908 Posted August 20, 2009 at 09:28 AM 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.
Dotinho Posted August 20, 2009 at 02:49 PM Report #283938 Posted August 20, 2009 at 02:49 PM Desculpa mas não entendi bem o teu problema.. Tens problemas ao fechar o OSD ou ao abri-lo? ou na mostragem dele? Luis Lourenço
softklin Posted August 20, 2009 at 03:12 PM Author Report #283940 Posted August 20, 2009 at 03:12 PM 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.
Dotinho Posted August 20, 2009 at 03:13 PM Report #283941 Posted August 20, 2009 at 03:13 PM tenta a opção me-topmost=true na for osd Luis Lourenço
softklin Posted August 20, 2009 at 03:22 PM Author Report #283942 Posted August 20, 2009 at 03:22 PM 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.
Dotinho Posted August 20, 2009 at 03:37 PM Report #283945 Posted August 20, 2009 at 03:37 PM 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
Dotinho Posted August 20, 2009 at 03:59 PM Report #283949 Posted August 20, 2009 at 03:59 PM Desculpa, mas o que é a ComPort? Luis Lourenço
softklin Posted August 20, 2009 at 04:10 PM Author Report #283951 Posted August 20, 2009 at 04:10 PM 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.
softklin Posted August 20, 2009 at 04:19 PM Author Report #283952 Posted August 20, 2009 at 04:19 PM 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.
Dotinho Posted August 20, 2009 at 04:22 PM Report #283954 Posted August 20, 2009 at 04:22 PM Muito bem 🙂 Se não formos nos a tratar de loopings, a threads acabam o processo sem nos saber-mos.. Luis Lourenço
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now