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.

Código: Selecionar todos

PROCEDURE Main
   hb_ThreadWaitForAll()
   RETURN

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