Página 3 de 4
Rotina em Segundo Plano
Enviado: 29 Mar 2017 15:07
por JoséQuintas
Ok, vamos de outra forma.
A Main tem janela invisível, está na thread principal, e colocou na rotina dela a chamada Events.
A janela que mostra travada está em outra thread, e não tem chamada a Events.
Relembrando: thread é como EXEs separados. Um EXE está travando, e colocou Events no outro.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 18:37
por asimoes
Quintas,
Nesse caso se você clica na janela principal onde executa a thread dá o Não está respondendo, a janela da thread programa separado tá ok, deu pra entender ?
Rotina em Segundo Plano
Enviado: 29 Mar 2017 18:52
por JoséQuintas
Isto é a janela principal, apenas não é visível.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:18
por JoséQuintas
Correção: isso é alguma coisa, pode ou não ser janela GTWIN, GTWVG, depende do default utilizado, de hb_gtSys() por exemplo.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:19
por asimoes
Mas no meu exemplo a janela principal ou onde dispara a thread é visível.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:24
por asimoes
Por exemplo eu posso disparar uma thread para impressão de algum relatório ou atualização de dados que demandam muito tempo de processamento, penso que isso é válido o uso da thread
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:38
por JoséQuintas
Uma janela visível, dois processos no gerenciador de tarefas.
Coloque a chamada de Evento() no for/next.
Apesar que, se é GTWVG, Inkey() já faz isso.
É até comum, DO WHILE Inkey() != K_ESC.; ENDDO
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:49
por asimoes
Vamos lá, na janela que eu quero executar a thread agora não tem janela nenhuma, então o foco tá na janela mãe
Código: Selecionar todos
* Janela mãe
nThread := hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, ;
HB_THREAD_INHERIT_PRIVATE, ;
HB_THREAD_INHERIT_MEMVARS ), ;
{ || Teste() } )
FUNCTION Teste()
FOR I:=1 TO 3000000
@ 0,0 SAY StrZero( I, 7 )
NEXT
RETURN Nil

- Screen Shot 03-29-17 at 07.45 PM.PNG (11.48 KiB) Exibido 3041 vezes
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:51
por asimoes
Quintas,
Coloquei Inkey() no for .. next e ficou a mesma coisa janela não respondendo
Rotina em Segundo Plano
Enviado: 29 Mar 2017 19:54
por asimoes
Quintas, matei a charada, na função teste não pode ter say pra tela
Código: Selecionar todos
FOR I:=1 TO 3000000
//@ 0,0 SAY StrZero( I, 7 )
Evento()
Inkey()
NEXT
Rotina em Segundo Plano
Enviado: 29 Mar 2017 20:03
por asimoes
Quintas
Descobre outra coisa.
Assim não dá janela não respondendo:
Veja a variável pública nLinha, exibindo nas 2 janelas nas funções Teste() e WaitThread( nThread )
Código: Selecionar todos
FUNCTION MAIN()
PUBLIC nLinha
nThread := hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, ;
HB_THREAD_INHERIT_PRIVATE, ;
HB_THREAD_INHERIT_MEMVARS ), ;
{ || Teste() } )
//hb_ThreadWaitForAll()
WaitThread( nThread )
RETURN Nil
FUNCTION Teste()
LOCAL oCrt
//oCrt := WvgCrt():new( , , { -1, -1 }, { 25, 80 }, , .T. )
oCrt := WvgCrt():New( , , { -1, -1 }, { 26, 80 }, , .F. )
oCrt:lModal := .T.
oCrt:visible := .T.
oCrt:resizable := .F.
oCrt:style := WIN_WS_POPUP + WIN_WS_CAPTION + WIN_WS_SYSMENU + DS_CENTER + WS_VISIBLE + WS_SYSMENU
oCrt:fontName := "Lucinda Console"
oCrt:fontHeight := 24
oCrt:fontWidth := 13
oCrt:create()
Hb_GTInfo( HB_GTI_WINTITLE, "Teste com Thread" )
HB_gtInfo( HB_GTI_MAXIMIZED, .T. )
FOR nLinha:=1 TO 3000000
@ 0,0 SAY StrZero( nLinha, 7 )
//Evento()
Inkey()
NEXT
oCrt:destroy()
RETURN Nil
FUNCTION WaitThread( nThread )
DO WHILE .T.
IF hb_ThreadWait( nThread, 0.1, .T. ) == 1
EXIT
ENDIF
@ 10,00 say nLinha
Evento()
ENDDO
RETURN Nil
Rotina em Segundo Plano
Enviado: 29 Mar 2017 20:04
por asimoes
Pessoal,
Peço um pouco de paciência são novos conhecimentos em um mundo windows mas agente acaba entendendo o funcionamento da coisa.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 20:09
por asimoes
Outra coisa clicando no título da janela filha thread o contador para em ambas janelas main e teste ainda não entendi esse comportamento
Rotina em Segundo Plano
Enviado: 29 Mar 2017 20:24
por cl@udio
Boa noite
Vendo este topico, queria tirar uma duvida.
Nao sei se seria com thread.
Mas por exemplo, digamos que estamos no menu do sistema e se escolhe o modulo de vendas.
Eu gostaria de chamar o modulo de vendas e ao mesmo tempo voltar ao menu do sistema e fazer outra operacao, ou chamar outra venda e assim navegar sem ficar preso aquela venda.
E mesmo fechando o sistema o modulo de vendas ficaria la funcionando a parte.
Rotina em Segundo Plano
Enviado: 29 Mar 2017 20:34
por asimoes
Claudio
Isso que você quer não funciona porque a janela chamadora uma vez encerrada, fecha todas as filhas.
mas o Mestre Quintas pode te esclarecer melhor