Rotina em Segundo Plano

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina em Segundo Plano

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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 ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina em Segundo Plano

Mensagem por JoséQuintas »

Isto é a janela principal, apenas não é visível.

Código: Selecionar todos

PROCEDURE Main
   hb_ThreadWaitForAll()
   RETURN
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina em Segundo Plano

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem por asimoes »

Mas no meu exemplo a janela principal ou onde dispara a thread é visível.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina em Segundo Plano

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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 3039 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem por asimoes »

Quintas,

Coloquei Inkey() no for .. next e ficou a mesma coisa janela não respondendo
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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   
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cl@udio
Usuário Nível 2
Usuário Nível 2
Mensagens: 88
Registrado em: 25 Jan 2007 16:47

Rotina em Segundo Plano

Mensagem 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.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Rotina em Segundo Plano

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder