Multithread x HB_BackGround
Moderador: Moderadores
Multithread x HB_BackGround
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??
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
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7929
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Multithread x HB_BackGround
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:
Ainda com Hwgui,
Ou podemos usar a função nativa do harbour hb_idleadd...
E por ultimo a própria MultThread
Saudações,
Itamar M. Lins Jr.
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)}
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()
Código: Selecionar todos
hb_idleAdd()
hb_idleDel()
hb_idleReset()
hb_idleSleep()
hb_idleState()
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()
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Multithread x HB_BackGround
É 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.
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/
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/
Multithread x HB_BackGround
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
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
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Multithread x HB_BackGround
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.
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/
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/
Multithread x HB_BackGround
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
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
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- Mario Mesquita
- Usuário Nível 4

- Mensagens: 613
- Registrado em: 08 Dez 2009 13:47
- Localização: Rio de Janeiro
Multithread x HB_BackGround
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.
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.
