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