Rotina em Segundo Plano - Thread

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

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 »

E a título de curiosidade, as threads com erro:
Note que elas usam QUIT.

Código: Selecionar todos

FUNCTION Teste()

   hb_gtReload( "WVG" )
   cVar := Space(10)

   SetMode( 25, 80 )
   CLS
   ? X
   @ 2, 20 SAY "teste" GET cVar
   READ

   QUIT
comerro.png
Mesmo com QUIT, cada thread é independente.
o QUIT não encerra o aplicativo, apenas a thread.
Nem mesmo o erro.
É como se fossem EXEs separados mesmo, exceto que se encerrar a thread principal encerra tudo.
Se retirar o hb_ThreadWaitForAll(), o programa vai encerrar antes mesmo de mostrar as outras janelas.
Motivo: encerrou Main() encerra tudo.

No começo parece ruim, não poder passar variáveis entre as threads, DBFs abertos, etc..
Mas depois acha isso excelente, porque evita criar problemas.
Não precisa se preocupar com área em uso, dbf aberto, índice selecionado, etc. porque uma thread não interfere na outra.
DBF aberto em uma thread é somente dela, e de mais nenhuma.

Até mesmo em minigui, pra poder abrir janelas à vontade e não se preocupar com DBFs é ótimo.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina em Segundo Plano

Mensagem por cjp »

Eu havia alterado a chamada à REQUEST porque não vi qualquer chamada à função hb_GTSYS(), mas fiz agora como vc disse.

Com essa forma não funcionou:

Código: Selecionar todos

PROCEDURE Main

 hb_ThreadStart( { || Teste() } )
 hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
 hb_ThreadWaitForAll()

 RETURN
Fecha direto, nem dá erro.

Mas assim funcionou a thread, mas a tela principal fica congelada até que eu feche a segunda tela:

Código: Selecionar todos

FUNCTION main()
  pargerais()
  hb_ThreadStart( { || Teste("I","Inacio","25/03/17","comin") } )
  hb_ThreadWaitForAll()
...
return

FUNCTION Teste()
         parameters us, nmus, vers, seis
		 
		 pargerais()

   hb_gtReload( "WVG" )
   cVar := Space(10)
         cadativ("Teste","Teste: início"," ",0,us,0,0," ")

   SetMode( 25, 80 )
   CLS
   @ 2, 20 SAY "teste" GET cVar
   READ

   RETURN NIL

PROCEDURE hb_GTSYS()

 REQUEST HB_GT_WVG_DEFAULT

 RETURN
E também continua "cortando" parte da tela.

E também continua abrindo a tela do principal em janela secundária.

O que ainda estou fazendo errado?
Inacio de Carvalho Neto
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 »

Num teste simples, pra ver o que falta, é bom usar hbmk2 teste gtwvg.hbc -w3 -es2

Também é bom usar a errorsys pra GUI.

Ajustei o primeiro fonte que mencionou.

Código: Selecionar todos

#include "hbthread.ch"
#include "hbgtinfo.ch"

PROCEDURE Main

   hb_ThreadStart( { || Teste() } )
   hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
   hb_ThreadWaitForAll()

   RETURN

FUNCTION Teste( ... )

   LOCAL x := 10, GetList := {}

   hb_gtReload( "WVG" )
   SetMode( 20, 80 )
   CLS
   @ 2, 20 SAY "x:" GET x
   READ
   RETURN NIL

PROCEDURE HB_GTSYS

   REQUEST HB_GT_WVG_DEFAULT

   RETURN
e compilei usando

Código: Selecionar todos

hbmk2 test -w3 -es2 gtwvg.hbc
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 segundo chama rotinas que não existem no fonte.
Tudo depende do que as rotinas fazem.

Lembre-se o seguinte: a primeira thread é a thread principal.
Se tiver um Inkey(0) ou algo assim, precisaria de tela, porque não vai conseguir teclar ENTER sem janela.
E se não teclar ENTER... o programa não prossegue pra abrir as outras threads.

Temporariamente pode deixar a thread principal visível pra ver do que se trata.

Código: Selecionar todos

PROCEDURE Main
   SetMode( 25, 80 )
   CLS
   ...
E lembre-se da errorsys. Utilize a minha que grava em disco e abre o bloco de notas, assim vai poder ver o erro, mesmo sem GT.
Sem janela visível também não tem errorsys.... rs

correção: nesse caso tem sim, porque mesmo a janela default invisível é gtwvg, se alguma coisa for apresentada na tela, a tela aparece automaticamente.
Por exemplo

Código: Selecionar todos

PROCEDURE Main
   ? // aqui acaba por zer aparecer uma tela main
   hb_ThreadStart( .... )
...
Nota: gtwvg.hbc já inclui o -mt, por isso não precisei colocar. Mas se colocar, tudo bem, mesmo que não use multithread/gtwvg.
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 »

Exagerando um pouco mais.
gtwvg.png
E acrescentando a outra errorsys.

Código: Selecionar todos

d:\temp>hbmk2 test \cvsfiles\allgui\common\errorsysallgui gtwvg.hbc
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina em Segundo Plano

Mensagem por cjp »

Fiz exatamente como vc disse (eu creio) e ainda está dando esse problema:

Quando compilo um teste.prg exatamente do jeito que vc mandou, a tela principal não aparece, só aparem as duas threads, cada uma numa tela.

Quando coloco na minha aplicação, a tela principal fica travada; as duas threads aparecem. Veja os anexos.

O código está assim:

Código: Selecionar todos

#include "hbthread.ch"
#include "hbgtinfo.ch"

PROCEDURE Main
   hb_ThreadStart( { || Teste() } )
   hb_ThreadStart( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_MEMVARS_COPY, { || Teste() } ) // variáveis públicas visíveis na thread
   hb_ThreadWaitForAll()

   RETURN
FUNCTION Teste( ... )

   LOCAL x := 10, GetList := {}

   hb_gtReload( "WVG" )
   SetMode( 20, 80 )
   CLS
   @ 2, 20 SAY "x:" GET x
   READ
   RETURN NIL

PROCEDURE HB_GTSYS

   REQUEST HB_GT_WVG_DEFAULT

   RETURN


Não sei se me fiz entender, mas o que eu disse quanto à tela principal aparecer em nova janela é o seguinte: o ideal pra mim é que a tela principal do sistema fique na janela principal, e que a thread (preciso de uma só) não apareça em janela nenhuma. Nesta não haverá gets, nem nada que requeira intervenção do usuário.

Mas o que está acontecendo é que a tela principal está aparecendo em uma segunda janela (a principal fica toda preta), que está sendo "cortada" (só aparece parte da tela), e as threads estão aparecendo em novas janelas.
Inacio de Carvalho Neto
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 »

Só estou estranhando que estamos no fórum minigui, e parece que no final não tem a ver com minigui.... rs

Está chamando o aplicativo via BAT?
Se chamar via BAT, vai ter a janela de console DO BAT.

bat pra aplicativo DOS/Console, ou windows, que vai deixar pendente a janela do BAT, sem problemas pra aplicativo console.:

Código: Selecionar todos

APLICATIVO.EXE
já pra aplicativo Windows, pra não ter a janela do BAT presa em aberto:

Código: Selecionar todos

START APLICATIVO.EXE
EXIT
Pode até fazer o teste com o bloco de notas, vai acontecer a mesma coisa.
Se chamar notepad.exe da primeira forma, a janela vai ficar presa até fechar o bloco de notas.

Ou chamar por atalho, que é o mais comum.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina em Segundo Plano

Mensagem por cjp »

Realmente não tem a ver com minigui, mas tem a ver com rotina em segundo plano.

Mudei o bat para start aplicativo.exe, mas continua abrindo assim (ver anexo).

E note que continua "cortando" a tela.
Anexos
Tela.png
Inacio de Carvalho Neto
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 »

Esqueci de um detalhe:
Por acaso definiu o tamanho da janela?

SetMode( 25, 80 )

Se não definir o tamanho, vai ser usado o tamanho da janela Windows.
Por exemplo: 1000 x 100

Aí seu aplicativo vai usar só uma parte da tela.
Na prática seria uma janela gigante, onde seu aplicativo só uma uma parte.
Isso acaba dando a impressão de que existem duas janelas.

É que agora vai poder usar tamanhos diferentes dos que usava antes, não vai ficar limitado a 25 x 80.

Isso vale pra qualquer thread, lembre-se que elas são independentes, cada uma vai ter seu próprio tamanho.
.
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 - Thread

Mensagem por JoséQuintas »

É desta aqui que estamos falando, certo?
Tela.png
Deve ter no programa um destes:

Código: Selecionar todos

@ 0, 0 CLEAR TO 24, 79
Scroll( 0, 0, 24, 79, 0 )
Dá pra ver o tamanho da janela pelo botão (X) Fechar.
A janela é maior que 25 x 80, mas no aplicativo só usou a parte de 25 x 80.
O conteúdo da janela maior que 25 x 80 ficou com o "lixo" anterior.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Rotina em Segundo Plano - Thread

Mensagem por cjp »

Sim, essa é a janela principal. Não tem scroll, mas tem set mode, assim:

Código: Selecionar todos

        setmode(45,125)
Aparentemente, o tamanho não está correspondente a esse setmode.

Ademais, o que eu estou dizendo é que a janela está cortando o sistema. Não é que o sistema esteja ocupando parte da janela apenas. Nessa última figura vc não vê diferença, pois a tela só tem isso. Mas a imagem anterior que eu postei mostra o menu superior (Finalizar - Ag. Financeira - Bancos - Telefones - Compromissos - Outros). Note que a imagem só mostra até Telefones, cortando cerca de 1/3 da tela.
Inacio de Carvalho Neto
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 - Thread

Mensagem por JoséQuintas »

gtwvg.png
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 - Thread

Mensagem por JoséQuintas »

gtwvg2.png
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 - Thread

Mensagem por JoséQuintas »

E com linhas/colunas diferentes em cada janela.
gtwvg3.png
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/
Christian_Marchiori
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 05 Abr 2017 22:54
Localização: Apucarana - Paraná

Rotina em Segundo Plano - Thread

Mensagem por Christian_Marchiori »

Parabéns pelos exemplos José Quintas, me ajudou aqui.
Tenho uma duvida, caso eu não queira que as threads abram uma nova janela, queria tudo na mesma, ambas vão ter gets, mas penso deixar apenas uma thread ativa por vez , e deixar a outra em pausa até que o usuário pressione uma tecla especifica, sabe me dizer se é possível?

Obrigado desde já.
Responder