Página 1 de 1

Thread ou novo Programa

Enviado: 29 Jul 2016 10:58
por rubens
Bom dia...
Preciso criar um monitor para as nfce. Preciso que ele fique rodando e verificando se tem alguma nfce pendente ou em contingência para ser enviada.
Daí dei uma pesquisada sobre thread.. Eu poderia executar uma thread para fazer isso? Ela vai ser carregada como se fosse um outro programa independente? Se o programa que executou essa thread for fechado ela fecha também?

Quanto a fazer um programa pra isso, deveria fica na barra de tarefas? Seria melhor ficar independente do sistema padrão ?

Obrigado
Rubens

Thread ou novo Programa

Enviado: 29 Jul 2016 11:04
por asimoes
Rubens,

Você pode usar funções que esperam o término da execução da thread antes de sair do sistema

Por exemplo:

Código: Selecionar todos

PUBLIC nThread 
nThread:=hb_ThreadStart( HB_BITOR( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), @Processo()  )
...

Antes de sair do programa

Aguarda o término da thread antes de sair.

Código: Selecionar todos

DO WHILE .T.
   IF hb_ThreadWait( nThread, 0.1, .T. ) == 1 
      EXIT
   ENDIF
ENDDO
Quit

Thread ou novo Programa

Enviado: 29 Jul 2016 11:25
por Toledo
rubens escreveu:Eu poderia executar uma thread para fazer isso?
Sim, com certeza.
rubens escreveu:Ela vai ser carregada como se fosse um outro programa independente?
Ela vai ser executada junto com o programa que a criou, mas de forma independente.
rubens escreveu:Se o programa que executou essa thread for fechado ela fecha também?
Sim, se o programa que a criou for encerrado, ela também será encerrada.
rubens escreveu:Quanto a fazer um programa pra isso, deveria fica na barra de tarefas?
Dependendo do objetivo do programa, sim, acho que seria melhor.
rubens escreveu:Seria melhor ficar independente do sistema padrão ?
Acho que seria melhor, você poderia colocar o programa para ser executado junto com o Windows, assim o programa ficaria em execução enquanto o computador estiver ligado.

Abraços,

Thread ou novo Programa

Enviado: 29 Jul 2016 12:38
por JoséQuintas
Só complementando o que o Toledo já colocou:

Imagine o seguinte:
O usuário sai fora do aplicativo, as threads são fechadas, e se tiver nota pendente... vai continuar pendente.

Ou...
O usuário abre o aplicativo, a thread verifica as notas.
O usuário abre o aplicativo em outra janela, serão duas threads verificando as notas, que podem se atrapalhar.

Já em programa separado, mais fácil de controlar.

Se deixar visível corre o risco do usuário fechar.
Por outro lado, se não ficar visível, o usuário não vai saber se está em execução.
Lembrando que pode até instalar isso como serviço no Windows, mas pode ficar sem mensagens de erro, por exemplo.

Lembrando também, que poderia existir a opção do servidor ficar processando, e não o terminal.

A questão é da parte operacional, antes da parte técnica.
A partir daí, a decisão é sua, sobre o que acha melhor.

Thread ou novo Programa

Enviado: 29 Jul 2016 14:54
por fladimir
Acredito q seja melhor um programa a parte no servidor.

Vc pode fazer teu sistema qdo entra verificar se o programa monitor esta rodando, caso não esteja starta, caso esteja ok..

Ai o programa monitor fica monitorando se terá notas pendentes de transmissão e se encarrega do resto.

Agora uma preocupação q deverá existir será o seguinte ao meu ver, terá q ter tipo uma forma de não conflitar com possíveis emissões normais... explico:

Pelo q vejo vc utiliza o ACBrMonitorPlus q monitora determinada pasta etc...

Ai teu aplicativo pode ter 1 ou mais terminais emitindo NFCe, ou seja, gerando arquivos para o ACBr em determinada pasta

Então uma situação q vc tem q pensar é q pode ser q teu monitor de NFCe q estejam em contingência num mesmo momento tentará transmitir as NFCes pendentes e algum terminal pode estar gerando NFCe, então tem q pensar em pra isto, caso a forma q vc faça seja semelhante a q eu coloquei acima.

Se teu sistema de vendas roda tipo OFFLine independente da Retaguarda seria outra questão a se pensar tb se monitora por PDV ou no Servidor.

Eu acredito q mesmo q seja OFFLine tb, tipo tenha PDVs independentes a melhor forma é centralizar o processamento no Servidor, tipo após sincronizar os PDVs com o Servidor o monitor se encarrega do restante (desde q observada uma forma de evitar conflito na hora de emitir com emissões normais q podem concorrer com os envios das pendentes)

Desculpe se compliquei, mas se esta usando o ACBr tem q pensar tb nestas questões.

[]´s

Thread ou novo Programa

Enviado: 29 Jul 2016 15:05
por asimoes
Na minha opinião também concordo com um processo externo a aplicação.
Que pode ser feito com harbour puro ou harbpur + hmg ou harbour + hwgui, pode ser systray ou serviço windows, para manutenção evetual o ideal é systray, porque serviço tem que parar o serviço e pode dar merca...se não souber fazer ou se deixar o usuário fazer isso. Se o usuário fechar a execução no systray o máximo que pode acontecer e não fazer nada, rs.

Thread ou novo Programa

Enviado: 29 Jul 2016 17:49
por rubens
No momento meu sistema só fecha venda em um local... Normalmente nao coloco o ACBR no servidor... Caso o ACBR congele o que é muito comum em Server 2008, as vezes é necessário reiniciar o pc nesse caso reiniciar um servidor onde tem uns 08 terminais fazendo venda e mais os pcs do administrativo é meio complicado... Então normalmente solicito do cliente uma máquina só para processar nfce... se houver disponibilidade outra para processar as nfe. Daí caso o tenha algum problema e tenha que resetar a máquina tá isolado.

Tenho um gerenciador de NFCe em minigui... de um programa que só emite nfce. Acho que vou partir dele para esse outro gerenciador robô... Só que o usuário tem que ter acesso a ele, porque com nfce tudo é possível.. éh cada erro 'desconhecido'... Não vou mudar o que já existe hoje... Só vou limitar mais o tempo na emissão de uma nfce... Em 10 segundos não obteve resposta.. entra em contigência... imprimir o danfe para o cliente e bola pra frente...

Daí esse gerenciador robô a cada período de tempo vai monitorar se existe alguma nfce em contigência, vai travar ela (para o caixa não tentar enviar manualmente naquele momento) e enviar.
No final do dia no fechamento do caixa se tiver cupons ainda não autorizados o caixa toma as devidas providências.

Em clientes que tem somente um pc funcionará basicamente da mesma forma. Nestes clientes hoje já não deixo fechar o caixa se tiver cupons abertos. Então o que o gerenciador robô não conseguir enviar o cliente vai ter que fazer manual.

Vou dar uma pesquisada de como colocar um programa para rodar no tray quando o pc iniciar...
Claro que se alguém já tiver alguma coisa nesse sentido, sinta-se a vontade para mostrar... ficarei muito grato...

Obrigado

Rubens

Thread ou novo Programa

Enviado: 29 Jul 2016 18:04
por asimoes
Rubens,

Eu tenho um servidor de impressão feito em minigui você pode modificar para o seu uso, esse utilitário roda no systray.

Este utilitário usa a minigui com mingw

Thread ou novo Programa

Enviado: 29 Jul 2016 18:18
por asimoes
Link da minigui compilada com harbour fork 3.4 + mingw 6.1

http://hmgextended.com/files/CONTRIB/hmg1607-mingw.exe

Thread ou novo Programa

Enviado: 29 Jul 2016 18:20
por Toledo
rubens escreveu:Tenho um gerenciador de NFCe em minigui...
Então veja:

Systray...
C:\MiniGUI\SAMPLES\Advanced\CuckooClock\CuckoClock.prg
C:\MiniGUI\SAMPLES\Advanced\SysInfoTray\SysInfoTray.prg

Thread...
C:\MiniGUI\SAMPLES\Advanced\Downloader\download.prg
C:\MiniGUI\SAMPLES\BASIC\WAIT_WINDOW_2\demo2.prg

Executar com o Windows...
C:\MiniGUI\SAMPLES\Applications\TRAY_CALENDAR\TrayCalendar.prg
obs.: procure por WinRun()

Abraços,

Thread ou novo Programa

Enviado: 29 Jul 2016 18:22
por asimoes
Link da minigui compilada com harbour fork 3.4 + mingw 6.1

http://hmgextended.com/files/CONTRIB/hmg1607-mingw.exe

Para o zip que eu postei, é só criar uma pasta MiniguiMingw e descompactar o conteúdo do link acima.

Fica assim:

Código: Selecionar todos

MiniguiMingw
   hmg
   minigui