Rotina em Segundo Plano

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Rotina em Segundo Plano

Mensagem por Claudio Soto »

asimoes escreveu: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   
Como cada thread tiene su propia cola de mensajes de Windows, el DoEvents solo vacía la cola del thread en el cual es llamado, para vaciar todas las colas hay que adjuntar todas las colas de mensajes a la del thread principal, de esa manera independiente de donde se invoque el DoEvents va a vaciar la cola de todos los thread:

El la función main se coloca:

Código: Selecionar todos

Private nMainThreadID := GetCurrentThreadID()
Y luego de llamar:

Código: Selecionar todos

Local pThID [ ... ]
pThID[ 1 ] := hb_threadStart( ....
pThID[ 2 ] := hb_threadStart( ....
pero antes de llamar cualquier ThreadWait se coloca:

Código: Selecionar todos

AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 1 ] ), .T. )
AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( pThID[ 2 ] ), .T. )
De esta manera se adjunta todas las colas de mensajes de cada thread a la cola de mensajes del thread principal.

El código de las funciones GetCurrentThreadID, AttachThreadInput, HMG_ThreadHBtoWinID y de otras funciones últimos están en c:\hmg.3.4.4\source\c_Thread.c

Existen varios ejemplos en la carpeta: c:\hmg.3.4.4\samples\MultiThread
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
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 »

Isso de multithread está bagunçando o fórum minigui.
Apesar que interessa pra todo mundo, inclusive pra migrar pra minigui ou mixar minigui.
Mas dá pra manter no assunto ainda:

Uma vez o módulo em multithread, ele poderá ser usado normalmente dentro da minigui.

Tem um exemplo antigo que postei, uns 2 anos atrás, procure no fórum o AllInOne, ou Tudo em um.
Dá pra fechar qualquer módulo ou até mesmo o menu principal.

Não estou certo se andei bagunçando o que está aqui:

https://github.com/JoseQuintas/AllInOne ... r/allinone
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 »

O link que indiquei está ok. Andei bagunçando, misturando com HWGUI, mas foi só na máquina local, e não no github.
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/
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 »

Nem vi que era fórum minigui.
Pensei que thread era do harbour.
Esquece tudo que falei. Não trabalho com minigui.
Mesmo assim agradeço.
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 »

Multithread é do Harbour sim.

Meu comentário foi porque tem mais exemplo "não-minigui" do que "minigui", apesar do tópico tratar de minigui.

Pensei que eu estava exagerando no tempo....

https://pctoledo.org/forum/viewto ... t=allinone

Foi em fevereiro/2014, completou 3 anos.
É GTWVG, que faz parte do Harbour.
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/
abarbosa
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 25 Jun 2015 17:39
Localização: Brasilia/DF

Rotina em Segundo Plano

Mensagem por abarbosa »

Olá,
Estou com um problema e lendo esse tópico acredito que alguém possa me ajudar.
Estou desenvolvendo um programa que faz envio de arquivos por FTP, meu problema é que ao se fazer o FTP a janela mostra "(não está respondendo)", depois do envio volta ao normal, como resolver isso? Não tenho o controle do upload do arquivo, podendo ser rápido ou demorado, depende da conexão e tamanho do arquivo.
Obrigado!
Avatar do usuário
jjr_rs
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 18 Mai 2009 18:56
Localização: Porto Alegre
Contato:

Rotina em Segundo Plano

Mensagem por jjr_rs »

Olá nilton579 e abarbosa,

Vou me meter na conversa. Quando tenho que realizar uma pesquisa que sei que irá demorar devido ao grande número de registros que irá retornar, simplesmente utilizo o seguinte comando:

WAIT WINDOW "Processando... Aguarde..." NOWAIT

***** aqui realizo a pesquisa e carrego em uma grid

e no final da carga utilizo:

WAIT CLEAR


É uma solução bem simples, mas que ajuda a sinalizar ao usuário que algo está acontecendo, mantendo-o longe de realizar qualquer tipo de digitação desnecessária durante a pesquisa.

Espero que tenha ajudado.


Att,
João
Bahsis Sistemas de Gestão
Responder