Página 2 de 3
Rotina em Segundo Plano
Enviado: 26 Mar 2017 02:43
por JoséQuintas
E a título de curiosidade, as threads com erro:
Note que elas usam QUIT.
Código: Selecionar todos
FUNCTION Teste()
hb_gtReload( "WVG" )
cVar := Space(10)
SetMode( 25, 80 )
CLS
? X
@ 2, 20 SAY "teste" GET cVar
READ
QUIT
Mesmo com QUIT, cada thread é independente.
o QUIT não encerra o aplicativo, apenas a thread.
Nem mesmo o erro.
É como se fossem EXEs separados mesmo, exceto que se encerrar a thread principal encerra tudo.
Se retirar o hb_ThreadWaitForAll(), o programa vai encerrar antes mesmo de mostrar as outras janelas.
Motivo: encerrou Main() encerra tudo.
No começo parece ruim, não poder passar variáveis entre as threads, DBFs abertos, etc..
Mas depois acha isso excelente, porque evita criar problemas.
Não precisa se preocupar com área em uso, dbf aberto, índice selecionado, etc. porque uma thread não interfere na outra.
DBF aberto em uma thread é somente dela, e de mais nenhuma.
Até mesmo em minigui, pra poder abrir janelas à vontade e não se preocupar com DBFs é ótimo.
Rotina em Segundo Plano
Enviado: 27 Mar 2017 00:11
por cjp
Eu havia alterado a chamada à REQUEST porque não vi qualquer chamada à função hb_GTSYS(), mas fiz agora como vc disse.
Com essa forma não funcionou:
Código: Selecionar todos
PROCEDURE Main
hb_ThreadStart( { || Teste() } )
hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
hb_ThreadWaitForAll()
RETURN
Fecha direto, nem dá erro.
Mas assim funcionou a thread, mas a tela principal fica congelada até que eu feche a segunda tela:
Código: Selecionar todos
FUNCTION main()
pargerais()
hb_ThreadStart( { || Teste("I","Inacio","25/03/17","comin") } )
hb_ThreadWaitForAll()
...
return
FUNCTION Teste()
parameters us, nmus, vers, seis
pargerais()
hb_gtReload( "WVG" )
cVar := Space(10)
cadativ("Teste","Teste: início"," ",0,us,0,0," ")
SetMode( 25, 80 )
CLS
@ 2, 20 SAY "teste" GET cVar
READ
RETURN NIL
PROCEDURE hb_GTSYS()
REQUEST HB_GT_WVG_DEFAULT
RETURN
E também continua "cortando" parte da tela.
E também continua abrindo a tela do principal em janela secundária.
O que ainda estou fazendo errado?
Rotina em Segundo Plano
Enviado: 27 Mar 2017 01:51
por JoséQuintas
Num teste simples, pra ver o que falta, é bom usar hbmk2 teste gtwvg.hbc -w3 -es2
Também é bom usar a errorsys pra GUI.
Ajustei o primeiro fonte que mencionou.
Código: Selecionar todos
#include "hbthread.ch"
#include "hbgtinfo.ch"
PROCEDURE Main
hb_ThreadStart( { || Teste() } )
hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
hb_ThreadWaitForAll()
RETURN
FUNCTION Teste( ... )
LOCAL x := 10, GetList := {}
hb_gtReload( "WVG" )
SetMode( 20, 80 )
CLS
@ 2, 20 SAY "x:" GET x
READ
RETURN NIL
PROCEDURE HB_GTSYS
REQUEST HB_GT_WVG_DEFAULT
RETURN
e compilei usando
Rotina em Segundo Plano
Enviado: 27 Mar 2017 02:01
por JoséQuintas
O segundo chama rotinas que não existem no fonte.
Tudo depende do que as rotinas fazem.
Lembre-se o seguinte: a primeira thread é a thread principal.
Se tiver um Inkey(0) ou algo assim, precisaria de tela, porque não vai conseguir teclar ENTER sem janela.
E se não teclar ENTER... o programa não prossegue pra abrir as outras threads.
Temporariamente pode deixar a thread principal visível pra ver do que se trata.
E lembre-se da errorsys. Utilize a minha que grava em disco e abre o bloco de notas, assim vai poder ver o erro, mesmo sem GT.
Sem janela visível também não tem errorsys.... rs
correção: nesse caso tem sim, porque mesmo a janela default invisível é gtwvg, se alguma coisa for apresentada na tela, a tela aparece automaticamente.
Por exemplo
Código: Selecionar todos
PROCEDURE Main
? // aqui acaba por zer aparecer uma tela main
hb_ThreadStart( .... )
...
Nota: gtwvg.hbc já inclui o -mt, por isso não precisei colocar. Mas se colocar, tudo bem, mesmo que não use multithread/gtwvg.
Rotina em Segundo Plano
Enviado: 27 Mar 2017 02:18
por JoséQuintas
Exagerando um pouco mais.
E acrescentando a outra errorsys.
Código: Selecionar todos
d:\temp>hbmk2 test \cvsfiles\allgui\common\errorsysallgui gtwvg.hbc
Rotina em Segundo Plano
Enviado: 27 Mar 2017 18:24
por cjp
Fiz exatamente como vc disse (eu creio) e ainda está dando esse problema:
Quando compilo um teste.prg exatamente do jeito que vc mandou, a tela principal não aparece, só aparem as duas threads, cada uma numa tela.
Quando coloco na minha aplicação, a tela principal fica travada; as duas threads aparecem. Veja os anexos.
O código está assim:
Código: Selecionar todos
#include "hbthread.ch"
#include "hbgtinfo.ch"
PROCEDURE Main
hb_ThreadStart( { || Teste() } )
hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
hb_ThreadWaitForAll()
RETURN
FUNCTION Teste( ... )
LOCAL x := 10, GetList := {}
hb_gtReload( "WVG" )
SetMode( 20, 80 )
CLS
@ 2, 20 SAY "x:" GET x
READ
RETURN NIL
PROCEDURE HB_GTSYS
REQUEST HB_GT_WVG_DEFAULT
RETURN
Não sei se me fiz entender, mas o que eu disse quanto à tela principal aparecer em nova janela é o seguinte: o ideal pra mim é que a tela principal do sistema fique na janela principal, e que a thread (preciso de uma só) não apareça em janela nenhuma. Nesta não haverá gets, nem nada que requeira intervenção do usuário.
Mas o que está acontecendo é que a tela principal está aparecendo em uma segunda janela (a principal fica toda preta), que está sendo "cortada" (só aparece parte da tela), e as threads estão aparecendo em novas janelas.
Rotina em Segundo Plano
Enviado: 27 Mar 2017 20:06
por JoséQuintas
Só estou estranhando que estamos no fórum minigui, e parece que no final não tem a ver com minigui.... rs
Está chamando o aplicativo via BAT?
Se chamar via BAT, vai ter a janela de console DO BAT.
bat pra aplicativo DOS/Console, ou windows, que vai deixar pendente a janela do BAT, sem problemas pra aplicativo console.:
já pra aplicativo Windows, pra não ter a janela do BAT presa em aberto:
Pode até fazer o teste com o bloco de notas, vai acontecer a mesma coisa.
Se chamar notepad.exe da primeira forma, a janela vai ficar presa até fechar o bloco de notas.
Ou chamar por atalho, que é o mais comum.
Rotina em Segundo Plano
Enviado: 28 Mar 2017 00:39
por cjp
Realmente não tem a ver com minigui, mas tem a ver com rotina em segundo plano.
Mudei o bat para start aplicativo.exe, mas continua abrindo assim (ver anexo).
E note que continua "cortando" a tela.
Rotina em Segundo Plano
Enviado: 28 Mar 2017 08:13
por JoséQuintas
Esqueci de um detalhe:
Por acaso definiu o tamanho da janela?
SetMode( 25, 80 )
Se não definir o tamanho, vai ser usado o tamanho da janela Windows.
Por exemplo: 1000 x 100
Aí seu aplicativo vai usar só uma parte da tela.
Na prática seria uma janela gigante, onde seu aplicativo só uma uma parte.
Isso acaba dando a impressão de que existem duas janelas.
É que agora vai poder usar tamanhos diferentes dos que usava antes, não vai ficar limitado a 25 x 80.
Isso vale pra qualquer thread, lembre-se que elas são independentes, cada uma vai ter seu próprio tamanho.
.
Rotina em Segundo Plano - Thread
Enviado: 28 Mar 2017 10:15
por JoséQuintas
É desta aqui que estamos falando, certo?
Deve ter no programa um destes:
Dá pra ver o tamanho da janela pelo botão (X) Fechar.
A janela é maior que 25 x 80, mas no aplicativo só usou a parte de 25 x 80.
O conteúdo da janela maior que 25 x 80 ficou com o "lixo" anterior.
Rotina em Segundo Plano - Thread
Enviado: 31 Mar 2017 00:32
por cjp
Sim, essa é a janela principal. Não tem scroll, mas tem set mode, assim:
Aparentemente, o tamanho não está correspondente a esse setmode.
Ademais, o que eu estou dizendo é que a janela está cortando o sistema. Não é que o sistema esteja ocupando parte da janela apenas. Nessa última figura vc não vê diferença, pois a tela só tem isso. Mas a imagem anterior que eu postei mostra o menu superior (Finalizar - Ag. Financeira - Bancos - Telefones - Compromissos - Outros). Note que a imagem só mostra até Telefones, cortando cerca de 1/3 da tela.
Rotina em Segundo Plano - Thread
Enviado: 31 Mar 2017 03:41
por JoséQuintas
Rotina em Segundo Plano - Thread
Enviado: 31 Mar 2017 03:52
por JoséQuintas
Rotina em Segundo Plano - Thread
Enviado: 31 Mar 2017 04:10
por JoséQuintas
E com linhas/colunas diferentes em cada janela.
Rotina em Segundo Plano - Thread
Enviado: 05 Abr 2017 23:02
por Christian_Marchiori
Parabéns pelos exemplos José Quintas, me ajudou aqui.
Tenho uma duvida, caso eu não queira que as threads abram uma nova janela, queria tudo na mesma, ambas vão ter gets, mas penso deixar apenas uma thread ativa por vez , e deixar a outra em pausa até que o usuário pressione uma tecla especifica, sabe me dizer se é possível?
Obrigado desde já.