Clipper On Line • Ver Tópico - Rotina em Segundo Plano

Rotina em Segundo Plano

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Rotina em Segundo Plano

Mensagempor Claudio Soto » 29 Mar 2017 22:00

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 )

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:
Private nMainThreadID := GetCurrentThreadID()


Y luego de llamar:
Local pThID [ ... ]
pThID[ 1 ] := hb_threadStart( ....
pThID[ 2 ] := hb_threadStart( ....


pero antes de llamar cualquier ThreadWait se coloca:
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 de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Rotina em Segundo Plano

Mensagempor JoséQuintas » 29 Mar 2017 22:30

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/tree/master/allinone
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina em Segundo Plano

Mensagempor JoséQuintas » 29 Mar 2017 22:45

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina em Segundo Plano

Mensagempor cl@udio » 29 Mar 2017 22:51

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.
cl@udio
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 88
Data de registro: 25 Jan 2007 15:47
Curtiu: 1 vez
Mens.Curtidas: 0 vez

Rotina em Segundo Plano

Mensagempor JoséQuintas » 29 Mar 2017 22:53

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

http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=14790&hilit=allinone

Foi em fevereiro/2014, completou 3 anos.
É GTWVG, que faz parte do Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Rotina em Segundo Plano

Mensagempor abarbosa » 26 Abr 2017 12:18

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!
abarbosa
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 25 Jun 2015 17:39
Cidade/Estado: Brasilia/DF
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Rotina em Segundo Plano

Mensagempor jjr_rs » 28 Abr 2017 02:09

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
Avatar de usuário

jjr_rs
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 72
Data de registro: 18 Mai 2009 18:56
Cidade/Estado: Porto Alegre
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Anterior



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro