Página 1 de 1

Multithread x HB_BackGround

Enviado: 17 Out 2014 19:30
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??

Multithread x HB_BackGround

Enviado: 17 Out 2014 20:19
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.

Multithread x HB_BackGround

Enviado: 17 Out 2014 22:30
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

Multithread x HB_BackGround

Enviado: 18 Out 2014 11:28
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

Multithread x HB_BackGround

Enviado: 18 Out 2014 13:40
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.

Multithread x HB_BackGround

Enviado: 20 Out 2014 10:09
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

Multithread x HB_BackGround

Enviado: 24 Jul 2015 16:23
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.