Página 1 de 1
Disparar um Rotina em Determinado Momento
Enviado: 07 Out 2006 18:52
por Dri
Hi de novo...
Tenho um pequeno sistema numa loja que vende ferramentas, monousuário (o sistema é multi-usuário, mas na loja não tem rede) e dizem que ficam até mais de um mês (loucos!) sem fazer backup.
Fazem (quando fazem, claro!) o backup num disquete do zip drive.
Ohem só... A loja (incrível!) fecha pro almoço, entre 11:30 e 13:00 horas, e não desligam o micro. O antivirus foi programado para ser passado neste horário e também possuem um sistema de um banco que transmite e recebe algumas informações neste horário (coisas de contas a pagar e a receber... Não sei bem!)
Me fizeram então a proposta de deixarem sempre um disquete no ZIP e o sistema no menu, aí, por volta de 12:30, que até então o micro já fez as transmissões e/ou recepções de/para o tal banco, o backup seria disparado. O backup todo num ZIP leva entre 10 a 15 minutos. É um sistema pequeno.
Well... Dá pra fazer isto em Clipper? Se dá, nem imagino como disparar um processo num certo momento! Me dêem uma força aí!
Brigadinha novamente!
Enviado: 07 Out 2006 19:58
por evaldo
Se vc fizer pelo sistema, o usuario tem que estar dentro do sistema, se nao tiver ai nao funciona, é melhor vc fazer pelo gerenciador de tarefa do windows, vc tem que criar um BACKUP.BAT e ir no gerenciador e adicionar nova tarefa e programar a hora que vc quer que dispara.
Re: Disparar um Rotina em Determinado Momento
Enviado: 08 Out 2006 03:47
por Maligno
Dri escreveu:Dá pra fazer isto em Clipper? Se dá, nem imagino como disparar um processo num certo momento!
Pense comigo: o fluxo de execução do seu programa sempre passará por algum ponto estratégico; uma espécie de funil. É nesse ponto onde você pode interferir para exercer um controle quase total sobre esse fluxo. Onde? No teclado. Pelo menos 99% dos programas necessitam de interação por parte do usuário, através da digitação. Se você modificar seu programa para, ao invés de usar Inkey() usar uma função chamada, digamos, GetKey(), qualquer parte do seu programa passará por esse ponto. Aí seu controle é quase que total. Não apenas para resolver esse problema de tarefas agendadas, mas vários outros. Exemplos: log-out após um certo tempo de inatividade, execução de funções globais, feedback sonoro ao digitar, sinalização e/ou disparo por eventos externos (comunicação serial, chat, etc) e várias outras coisas.
Minha GetKey() tem quase tudo isso. Nem esquento a cabeça mais com esses problemas. Eu simplesmente cadastro em GetKey() os dados e/ou blocos de códigos que preciso que sejam disparados por um evento qualquer. Seja um tecla pressionada (função global) ou um timer pré-estabelecido (data/hora) ou uma contagem de segundos (periódico). Inclusive, posso tornar as teclas Alt, Control e Shift ativas. Nos meus programas, o pressionar das duas teclas Shift dispara um screen saver. Pressionar Alt por 2 segundos faz aparecer um menu de contexto, que funciona como um help nos meus browsers. A imaginação é o limite.

Aliás, tem outra vantagem: mesmo super-carregada, se bem codificada, sua GetKey() não produzirá nenhuma alteração significativa no consumo de tempo de CPU.
Em suma: controlar GetKey() significa poder tornar possíveis muitas funções interessantes. Inclusive essa que você precisa. Se antes você nem imaginava como fazer, está aí uma idéia que sei que funciona.
Agora, falando diretamente sobre o seu problema, acredito que uma boa alternativa é você usar o WinZIP versão 10, que conta agora com um editor de script. Nele você configura como será seu backup. E por meio do agendador de tarefas do Windows, você executa esse script. O WinZIP entra em ação e realiza o serviço. Não testei isso. Nem sei se pelo agendador de tarefas dá pra "invocar" um programa através de um arquivo a ele associado. Mas é uma idéia. E se esta idéia não der certo, você também tem a opção de usar o WinZIP de linha de comando, já com os argumentos corretos para o backup. Esse certamente funcionará pelo agendador do Windows. Usar um programa desses tem a vantagem de ser rápido de implementar. É só mesmo o tempo de testar e colocar em funcionamento no seu cliente.
[]'s
Maligno
http://www.buzinello.com/prg
PS: Até poderia te passar a minha GetKey(). Não trabalho mais com Clipper nem XBase e estou liberando minhas LIBs aos poucos. Mas não posso, por enquanto. O problema é que esta função está atrelada a várias outras e não vou liberar nada sem redigir uma boa documentação e criar exemplos de uso. Se deixasse isso de lado, certamente eu não trabalharia mais. Só responderia eMails de dúvidas. Ou deixaria todo mundo na mão. Aí não dá.

)))
Enviado: 08 Out 2006 08:04
por Dri
Maligno, muito obrigada novamente!!!
Valeu suas idéias quanto ao script do WinZip e o agendador de tarefas do Windows, ou mesmo que não seja um script do WinZip e nem mesmo o WinZip, talvez o Rar ou WinRar (não uso o WinZip... Apenas questão de gosto!). O agendador de tarefas é que disparará o programa que eu determinar.
Putz, nem de leve me ocorreu o agendador de tarefas do Windows...
E quanto à GetKey(), entendi bem o que você expos quanto a necessidade e versatilidade, mas devido ao meu baixo nível de programação (o inverso de linguagens de baixo nível: poderosa! rsrsrsr), não entendi bem como implementar...
O único lugar que tenho a função INKEY() em meus sistemas é na função que chama o TBrowse.
Agora, se por exemplo, o usuário abriu uma tela de cadastro, fez o cadastro, ou começou a fazer e parou no meio do caminho para colher uma informação para o cadastro, onde e como coloco o controle para que a função GetKey() seja disparada?
Valeu, valeu, valeu...
Enviado: 08 Out 2006 12:23
por Maligno
Putz, nem de leve me ocorreu o agendador de tarefas do Windows...
Às vezes também me dá um branco e esqueço coisas mais básicas que isso.
E quanto à GetKey(), entendi bem o que você expos quanto a necessidade e versatilidade, mas devido ao meu baixo nível de programação (o inverso de linguagens de baixo nível: poderosa! rsrsrsr), não entendi bem como implementar...
Tudo tem um começo. O importante é ter o interesse e a disposição pra começar.
O único lugar que tenho a função INKEY() em meus sistemas é na função que chama o TBrowse.
Agora, se por exemplo, o usuário abriu uma tela de cadastro, fez o cadastro, ou começou a fazer e parou no meio do caminho para colher uma informação para o cadastro, onde e como coloco o controle para que a função GetKey() seja disparada?
Simples: em todo os lugares em que InKey() for utilizada. No seu programa e no sub-sistema GET. Lá também tem algumas chamadas à InKey(). Substituir InKey() é a parte mais fácil. Qualquer bom editor de texto pode fazer substituições em vários arquivos, de forma automática. Depois disso é só recompilar.
A parte mais trabalhosa (não digo que seja complicada - de fato não é tanto) é desenvolver sua GetKey(). A título de curiosidade, eis uma parte da minha GetKey():
Código: Selecionar todos
//*********************************************************
function GetKey(nSeconds,lLockPKeys)
local nInit := Str2Second(Time())
local nKey := 0
local lAlt
local lCtr
local lShf
*
if lKeyLock
clear typeahead
return _kVOID
end
default lLockPKeys to _kFALSE
if lLockPKeys
lAlt := SetAltFlag(_kOFF)
lCtr := SetCtrFlag(_kOFF)
lShf := SetShfFlag(_kOFF)
end
lTimeOut := _kFALSE
while _kTRUE
AltHandle()
CtrHandle()
ShfHandle()
*
if (nKey := KeyLast()) != 0 .or. (nKey := InKey()) != 0
OnKeyPress()
if RunGlobKey(nKey) .or. FKsBoxProp(nKey)
nKey :=0
else
exit
end
end
*
if nSeconds = _kVOID
exit
end
if nSeconds != 0
if nSeconds = Str2Second(Time())-nInit
lTimeOut := _kTRUE
exit
end
end
end
*
if lLockPKeys
SetAltFlag(lAlt)
SetCtrFlag(lCtr)
SetShfFlag(lShf)
end
return nKey
A princípio, talvez assuste um pouco, mas a mecânica dela é bem simples. Faltam algumas funções de apoio nesse fonte, além de algumas outras funções da minha LIB. É só pra você ter uma idéia.
O importante é que ela faz exatamente o mesmo que InKey(). Só que acrescenta várias outras funcionalidades.
Se você realmente estiver disposta a mudar e construir sua GetKey(), podemos trocar idéias num outro tópico aberto só pra isso e aproveitar a participação dos colegas. Depois que você fizer a troca de InKey(), principalmente no GETSYS (está na pasta SOURCES\GETSYS do Clipper). De início, só pra essa substituição, você pode fazer isso:
Isso torna GetKey() absolutamente igual a InKey(). A idéia então, é ir adicionando as funcionalidades aos poucos. O aprendizado fica mais fácil dessa forma. A minha eu fiz aos poucos, conforme fui precisando de novas funcionalidades.
[]'s
Maligno
http://www.buzinello.com/prg
Enviado: 09 Out 2006 16:32
por Dri
Hi!
Maligno, não esqueci do tópico não...
Assim que puder, darei uma olhada no GETSYS para absorver melhor esta idéia.
E aceito sua proposta sim!
Assim que for trablhar com este assunto, abrirei um tópico para você me auxiliar!
Muito obrigada!!!
Enviado: 09 Out 2006 17:09
por kiko
vc pode usar tb um gerenciador de back up
posso lhe indicar o Cobian Backup
http://www.educ.umu.se/~cobian/cobianbackup.htm
posso dizer que é o mais completo que eu encontrei, alem de ser free...hehe
ele tem mtos recursos, desde apenas copiar de um diretorio para outro, ate compactar e executar um outro programa externo, para gravar o back up em cd, por exemplo.
ele fica rodando em segundo plano, quando da a hora marcada, ele pega os arquivos indicados na configuracao e faz o q vc definiu antes...
ate a proxima