Página 4 de 4

Rotina em Segundo Plano

Enviado: 29 Mar 2017 22:00
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

Rotina em Segundo Plano

Enviado: 29 Mar 2017 22:30
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

Rotina em Segundo Plano

Enviado: 29 Mar 2017 22:45
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.

Rotina em Segundo Plano

Enviado: 29 Mar 2017 22:51
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.

Rotina em Segundo Plano

Enviado: 29 Mar 2017 22:53
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.

Rotina em Segundo Plano

Enviado: 26 Abr 2017 12:18
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!

Rotina em Segundo Plano

Enviado: 28 Abr 2017 02:09
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