Multithread x HB_BackGround

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

Moderador: Moderadores

Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Multithread x HB_BackGround

Mensagem por janio »

Pessoal,

Preciso de tempos em tempos rodar uma rotina bem pesada para atualização de um banco de dados! Ocorre que neste caso eu não sei se seria melhor Multithread ou HB_BackGround. Na verdade eu não sei nem qndo e como usar e outro. Como não sei a diferença entre essas funções.

Como estou vindo do xharbour, la não tive coragem de mim aventurar nesse negocio de multithread e por isso não sei patavina nenhuma desse assunto.

Alguma dica??
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Multithread x HB_BackGround

Mensagem por Itamar M. Lins Jr. »

Ola!
Existem n formas.
Você pode inclusive usar um EXE criado pelo [x]Harbour para fazer isso, adicionando via agendador de tarefas no windows.
Agora a forma mais SMART! é via Barra de Tarefas do Windows!
Tem exemplos usando Minigui ou Hwgui aqui no forum.
Se quer usar dentro do seu sistema esse recurso, isso vai depender de qual lib gráfica.
Com Hwgui temos:

Código: Selecionar todos

   Set Timer oHora Of oDlg ID 33900 Value 9900 Action {||FuncaoXYZ(oDlg)}
Ainda com Hwgui,

Código: Selecionar todos

*************
Function Main
*************
*
*
Local cIniFile:="monitor.ini", oIcon
Local IniDir := GetE("SystemRoot")+"\"
Private ArrayFile, DriveO, DriveD, oHora, cImageDIr := "imagens\"

if !file( IniDir+cIniFile )
	hwg_Msgstop('Processo Cancelado. Arquivo de Configuração não Localizado')
	cancel
endif

DriveO := Hwg_GetIni('Config','DriveOrigem',,cIniFile)
DriveD := Hwg_GetIni('Config','DriveDestino',,cIniFile)

ArrayFile := { "estoque.dbf",  "grupos.dbf",   "forneced.dbf", "especie.dbf", ;
               "receber.dbf",  "caixa.dbf",    "clientes.dbf", "vendedor.dbf", "pagar.dbf" }

hb_setcodepage([PTISO])
hb_langselect([PT])
RDDSetDefault("DBFCDX")
Set Autopen on

   oIcon := HIcon():AddFile(cImageDir+"xyz.ico") 
   INIT WINDOW oFormMain MAIN APPNAME "XYZ Monitor" TITLE "Sistema Integrador De Dados Do XYZ //  Versão 1.0" ;
   On Init {||AtivarTempo()}

   CONTEXT MENU oTrayMenu
       MENUITEM "Monitorar Arquivos"  ACTION {||Monitora()}
       MENUITEM "Sai&r"               ACTION hwg_EndWindow()
       SEPARATOR
       MENUITEM "&Sobre" ACTION hwg_Msginfo("Módulo Para Monitoramento de Dados Via REDE do sistemas XYZ"+CrLf+"Copyright(c) XYZ Informática" + CRLF + "Desenvolvido Por: Itamar M. Lins Jr.")
   ENDMENU 

   oFormMain:InitTray( oIcon,,oTrayMenu,"Monitor" )

   ACTIVATE WINDOW oFormMain NOSHOW
   oTrayMenu:End()
Ou podemos usar a função nativa do harbour hb_idleadd...

Código: Selecionar todos

   hb_idleAdd()
   hb_idleDel()
   hb_idleReset()
   hb_idleSleep()
   hb_idleState()
E por ultimo a própria MultThread

Código: Selecionar todos

C:\Users\Itamar\DOCUME~1\GitHub\HARBOU~1\doc>hbmk2 -find thread
hbxpp.hbc (instalado):
   Thread()
   ThreadID()
   ThreadObject()
   ThreadWait()
   ThreadWaitAll()
hbsqlit3.hbc (instalado):
   sqlite3_threadsafe()
hbwin.hbc (instalado):
   wapi_GetCurrentThread()
   wapi_GetCurrentThreadId()
rddads.hbc (não instalado):
   AdsMgGetWorkerThreadActivity()
xhb.hbc (instalado):
   GetCurrentThread()
   GetSystemThreadId()
   GetThreadId()
   hb_MultiThread()
   IsSameThread()
   IsValidThread()
   JoinThread()
   KillAllThreads()
   KillThread()
   StartThread()
   StopThread()
   ThreadGetCurrent()
   ThreadGetCurrentInternal()
   ThreadSleep()
   WaitForThreads()
N├║cleo Harbour (instalado):
   hb_threadDetach()
   hb_threadID()
   hb_threadJoin()
   hb_threadOnce()
   hb_threadOnceInit()
   hb_threadQuitRequest()
   hb_threadSelf()
   hb_threadStart()
   hb_threadTerminateAll()
   hb_threadWait()
   hb_threadWaitForAll()
addons\hbqt\hbqtcore.hbc (instalado):
   HB_QTHREAD()
   QTHREAD()
addons\hbqt\qtcore\hbqtcore.hbc (instalado):
   HB_QTHREAD()
   QTHREAD()
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Multithread x HB_BackGround

Mensagem por JoséQuintas »

É simples, mas não é tanto, precisa entender o funcionamento disso.

Ao usar multithread ok, a rotina vai usar uma área totalmente isolada.
Mas se fechar o programa principal, a rotina vai se fechar também.

Então teria que ter seu programa principal como uma espécie de "zumbi", sem tela e preparado pra encerramento.
É porque não pode deixar o usuário fechar o programa principal, mas também não pode deixar ele rodando pra sempre.

Faça vários testes antes de colocar em ambiente pra rodar pra valer.

De repente, poderia rodar usando outra janela do Windows, usando o mesmo EXE.

Código: Selecionar todos

RUN ( "start seuexe.exe background" )
...

procedure main
   parameters cName

   if cName != NIL
      if cName == "background"
         rotinabackground()
         quit
       endif
   endif
   RETURN

FUNCTION RotinaBackGround()
    ... sua rotina
   RETURN NIL
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
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Multithread x HB_BackGround

Mensagem por janio »

Quero evitar a todo custo ter que levar ao cliente mais um exe.

Meu desejo eh q a pessoa esteja trabalhando normalmente e o sistema de tempos em tempos execute a rotina. O usuario num precisa nem saber e nem ver a rotina sendo executada.

Pensei em usar mt, mas talvez HB_BackGroundAdd + HB_IdleAdd seja a melhor opcao!

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Multithread x HB_BackGround

Mensagem por JoséQuintas »

Se o problema é apenas a quantidade de EXEs, pode fazer como mencionei.
Mesmo tudo junto, é só o EXE receber um parâmetro e desviar pra outras rotinas.
Fiz isso pra uma junção rápida de EXEs, sem que uma rotina interferisse na outra, até poder fazer todos os ajustes necessários.
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
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Multithread x HB_BackGround

Mensagem por janio »

Muito criativa essa 'gambi' pra usar mt desviando o sistema atraves de um parametro. Eu nunca tinha pensado nisso! rsrsrs

Estou fazendo alguns testes, inclusive essa do parametro no exe q achei show!

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Multithread x HB_BackGround

Mensagem por Mario Mesquita »

Boa tarde!

Eu uso HMG e tentei, baseado em um manual que baixei por aí, usar a função HB_BackGround() para executar uma rotina de contagem para ser mostrada em uma tela que pode estar em algumas máquinas.

Mas deu erro de compilação e acho que é porque é uma função do xHarbour.

A pergunta é: Qual o seu equivalente no Harbour? Estou usando ainda a HMG 3.0.46

Desde já, agradeço a ajuda.

Saudações,
Mario.
Responder