Clipper On Line • Ver Tópico - DICA: Uso de semaforo em sistemas com Fivewin.

DICA: Uso de semaforo em sistemas com Fivewin.

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor rochinha » 31 Ago 2010 01:33

Amiguinhos,

Ao implementar o procedimento de semaforos em nossos sistemas nos deparamos sempre com o seguinte problema:

Se um registro for travado em uma estação, outra estação não poderá ter acesso a alteração do mesmo. Então implementamos a seguinte mensagem. registro travado em outra estação.

Poxa, mas se ta travado não posso fazer nada?

Posso sim, Visualiza-lo.

Mas como visualizar sem causar algum tipo de problema no mesmo.

Como sabemos a função RLock() ou dbRlock() é uma faca de dois legumes. Se numa rede duas maquinas tentam ao mesmo tempo travar um registro no final o que teremos é um registro destravado, pois num milésimo de segundo o registro foi travado e no outro destravado.

Então a solução, sempre será o uso de semáforos e cada um implementa da forma mais coerente e funcional.

Estes problemas de travamento não é só dos RDDs NTX/CDX e acontecem também no MySQL( já tive relatos de dificuldades neste sentido ).

No meu caso, a idéia não seria apresentar uma mensagem ao usuário e fechar, mas sim permitir ao usuário ainda visualizar o registro sem permitir alterações.

Todas as minhas tabelas possuem um campo identificador unico que chamo de IDESTACAO mas voce pode criar o seu a seu gosto.

Em Fivewin ou outra GUI esta técnica seria possivel seguinte o exemplo abaixo:
SELE CLIENTES
...
lSemaforo := .f.
if CLIENTES->IDESTACAO = 0
   // SEMAFORO LIGADO
   CLIENTES->( dbRLock() )
   CLIENTES->IDESTACAO := user_id // Travo o registro, salvo o IDentificador do usuario e libero o registro
   CLIENTES->( dbUnlock() )
   CLIENTES->( dbCommit() )
else
   lSemaforo := .t.
   //Isto eu nao quero
   //MsgRun( "Registro "+alltrim(str(CLIENTES->IDCLIENTE))+" sendo atualizacao em outra estacao!" )
   //return .t.
endif
...
// Carregos os campos em variaveis e faço a alteração ou visualizao


O pulo do gato ficaria por conta da propria interface:
...
   ACTIVATE DIALOG oDialog ON INIT iif( lSemaforo, oButton:Disable(), oButton:Enable() )
...


Então o codigo de fechamento ficaria assim:
...
REDEFINE BUTTON oButton ID  100 OF oDialog PROMPT "Confirma e fecha." ACTION ( lSave := .t. , oDialog:End() )
...
   ACTIVATE DIALOG oDialog ON INIT iif( lSemaforo, oButton:Disable(), oButton:Enable() )
   if lSave
      // Salvar o Registro
      ...
   else
      GO nRegClient
      if CLIENTES->IDESTACAO # 0 // Se o registro foi marcado
         if CLIENTES->IDESTACAO = user_id // Se o usuario e o mesmo que marcou
            // MsgRun( "Liberando o registro" )
            // SEMAFORO LIGADO
            CLIENTES->( dbRLock() )
            CLIENTES->IDESTACAO := 0
            CLIENTES->( dbUnlock() )
            CLIENTES->( dbCommit() )
         endif
      endif
   endif
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor Eric.Developer » 26 Mar 2011 04:57

Olá Rochinha,

pela forma que descreveu a explicação e o código, não vi sentido nesta rotina, pois não podendo travar um registro já bloqueado e reverter para leitura, não precisamos de semáforo. Também não vejo problemas nas regras de bloqueio.
Para você usar sua rotina de forma mais eficiente, saber se um registro esta ou não bloqueado por outro usuário, deve usar RLock()/dbRlock(), para este fim nunca poderá se basear em leitura de campos, lembre-se, o usuário esta numa linha do código, não quer dizer que irá para a próxima, e se houver runTimeError ?! o micro se desligar ?!, e se .... ??!!
Um pequeno erro, o correto é: DBCommit() e depois DBUnLock().

Uma vantagem na rotina, será possível saber qual foi o usuário que bloqueou, apesar que não requer semáfaro e dá para simplificar sem campo extra em cada tabela para saber qual usuário.

rochinha escreveu:Ao implementar o procedimento de semaforos em nossos sistemas nos deparamos sempre com o seguinte problema:

Se um registro for travado em uma estação, outra estação não poderá ter acesso a alteração do mesmo. Então implementamos a seguinte mensagem. registro travado em outra estação.

Poxa, mas se ta travado não posso fazer nada?

Posso sim, Visualiza-lo.

Mas como visualizar sem causar algum tipo de problema no mesmo.

Como sabemos a função RLock() ou dbRlock() é uma faca de dois legumes. Se numa rede duas maquinas tentam ao mesmo tempo travar um registro no final o que teremos é um registro destravado, pois num milésimo de segundo o registro foi travado e no outro destravado.

Então a solução, sempre será o uso de semáforos e cada um implementa da forma mais coerente e funcional.

Estes problemas de travamento não é só dos RDDs NTX/CDX e acontecem também no MySQL( já tive relatos de dificuldades neste sentido ).

No meu caso, a idéia não seria apresentar uma mensagem ao usuário e fechar, mas sim permitir ao usuário ainda visualizar o registro sem permitir alterações.

Todas as minhas tabelas possuem um campo identificador unico que chamo de IDESTACAO mas voce pode criar o seu a seu gosto.
Delphi, SQL, FastReport | Xailer VxH Fivewin Minigui Hwgui [x]Harbour
Contate-me: Desenvolvimentos em geral | Treinamentos
Overview/Download: Xailer / Harbour Ferramenta profissional e mais completa.
Avatar de usuário

Eric.Developer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 31 Ago 2010 22:16
Curtiu: 0 vez
Mens.Curtidas: 8 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor rochinha » 26 Mar 2011 11:11

Amiguinho,

Costumo trabalhar em rede usando variáveis para suporte aos dados dos campos que pretendo alterar ou não.

No final se eu realmente desejo salvar o conteudo, executo o travamento do registro e pronto.

Este é o método praxe para manutenção de dados em rede.

O que não tem sentido seria usar um rlock() para travar um registro, tendo em vista que o mesmo é falho, ou nunca aconteceu com voce, de travar um registro em um terminal e outro terminal ao travar o mesmo registro destravar o primeiro.

Não usei aqui técnicas de semáforo para registro através de travamentos por rlock() e sim uma alternativa menos falível que a primeira.

Com certeza voce não entendeu a proposta da rotina e não leu os comentários.

O programador que se utilizar da rotina encontrará meios de melhorá-la ou pelo menos terá uma idéia de como usar a própria interface para auxiliá-lo.

A técnica do semáforo tem mais longevidade que meus poucos 25 anos de programação e raras vezes fiz uso da mesma.

Quanto a queda de energia, ai já é outra rotina...

Fique a vontade a melhorar a idéia.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor Pablo César » 26 Mar 2011 11:39

O que não tem sentido seria usar um rlock() para travar um registro, tendo em vista que o mesmo é falho, ou nunca aconteceu com voce, de travar um registro em um terminal e outro terminal ao travar o mesmo registro destravar o primeiro.
Comigo nunca aconteceu isso ou ao menos nunca poderia ter acontecido, pois a idéia de travar registro pelo RLOCK() é necessária em rede mas o tratamento através de uso de semáforos aliada com todo o tratamento de rede (RLOCK, FLOCK, UNLOCK...) são bem vindos. Acho mais provável falhar o semáforos que não sejam bem implementados do que o uso do RLOCK. Bem essa é a minha opinião.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor rochinha » 26 Mar 2011 11:52

Amiguinhos,

Me espressei mal ao comentar que o uso de RLock() é desnecessário.

Que fique bem frisado que RLock() é imprescindivel para o travamento de registros em rede.

Quanto a semáforos: estes são implementações para suprir a deficiencia dos travamentos.

E em relação a elas como disse anteriromente, raramente fiz uso.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor Eric.Developer » 26 Mar 2011 17:08

rochinha escreveu:Costumo trabalhar em rede usando variáveis para suporte aos dados dos campos que pretendo alterar ou não.

No final se eu realmente desejo salvar o conteudo, executo o travamento do registro e pronto.

Este é o método praxe para manutenção de dados em rede.
...
Não usei aqui técnicas de semáforo para registro através de travamentos por rlock() e sim uma alternativa menos falível que a primeira.

Com certeza voce não entendeu a proposta da rotina e não leu os comentários.

O programador que se utilizar da rotina encontrará meios de melhorá-la ou pelo menos terá uma idéia de como usar a própria interface para auxiliá-lo.

A técnica do semáforo tem mais longevidade que meus poucos 25 anos de programação e raras vezes fiz uso da mesma.

Quanto a queda de energia, ai já é outra rotina...

Fique a vontade a melhorar a idéia.


Não vejo porque melhorar algo sem utilidade prática.
Geralmente quando se usa RLOCK é porque quer SOMENTE atualizar um ou mais campos da tabela, não podendo deve-se parar todo o processo, fácil e simples quando é somente uma tabela. No seu caso quando não bloqueia, você deseja reverter para visualizar o registro, lhe sendo extramente útil, quem deseja isso fora do comum (pra mim sem sentido), você esta esquecendo que deverá preparar TODAS as rotinas de formulários, sem necessidade de semáfaro ou pulo do gato.

rochinha escreveu:O que não tem sentido seria usar um rlock() para travar um registro, tendo em vista que o mesmo é falho, ou nunca aconteceu com voce, de travar um registro em um terminal e outro terminal ao travar o mesmo registro destravar o primeiro.

RLOCK não tem nenhum problema, se ele retorna FALSE é porque está em uso por outro usuário, algo totalmente previsível. O que vejo com frequencia são erros de lógica/conceito ao se implementar inclusão, alteração e autonumeração.
Um usuário destravando registro de outro ?! essa não !! Se realmente codificou certo, pode estar relacionado ao conjuto (Linguagem, hardware, rede, OS, etc), e versões dessa década ou o problema não era esse. Não sei que testes fez na ocasião, por mais que pareça ser uma coisa, é prematuro culpar a linguaguem, ela não trabalha sozinha.

Há somente alguns anos, depois de dois meses que entrei numa empresa, me pediram para ir no cliente resolver um problema (erro ao abrir qualquer DBF) que só acontecia lá e de vez em quando, fazia mais de 1 ano e ninguem conseguiu acertar e por isso logo iriam cancelar o contrato. Estando no cliente, somente depois de 2 dias consegui reproduzir o problema, levei menos de 1 hora para criar uma solução de forma eficiente, com algumas linhas de código no sistema. Onde será que foi a causa do problema, na linguagem ou no restante do conjunto (OS, Rede, Hardware, etc) ? Até hoje nunca vi ninguém reclamar do mesmo problema.

Cuidado em achar que alguns detalhes da sua época seja relevante, técnicas, conceitos, versões, conjunto, soluções, problemas... mudam muito ! Ficou claro que dá forma que esta sua rotina lhe é muito útil, é o que importa.
Delphi, SQL, FastReport | Xailer VxH Fivewin Minigui Hwgui [x]Harbour
Contate-me: Desenvolvimentos em geral | Treinamentos
Overview/Download: Xailer / Harbour Ferramenta profissional e mais completa.
Avatar de usuário

Eric.Developer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 31 Ago 2010 22:16
Curtiu: 0 vez
Mens.Curtidas: 8 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor rochinha » 26 Mar 2011 17:21

Amiguinho,

Com toda franqueza, o intuito do tópico foi apresentar uma idéia, para quem quizer usar.

Se alguém optar por usá-la irá implementar para sua utilidade, caso não, simplemente passará batido.

Acho que em todo este tempo de forum, tentei me apresentar da forma mais simplória, apresentando soluções e dicas e nunca, nunca para discutir meu ponto de vista, caso eu ache que ele é melhor ou não.

Se não servir ao intuito, então exponha uma solução, e se possivel grátis, perca seu tempo aqui, ajudando, dando soluções ou passando o seu conhecimento, pois eu não disponho de muito tempo, mas quando posso tento ajudar de forma rápida.

Se um dia sentarmos para discutir programação, que seja numa mesa de bar, bebendo e gargalhando.

Seja breve e consiso e acima de tudo, me respeite.

Abaixo a transcrição de um email longinquo de um AmmIgo. Rápido e simples, apresentou uma solução apenas criticando os ponto fracos.

Rochinha,

En Clipper on line usted explica como usar semaforos.
Yo hace tiempo lo resolvi de otra forma y se lo comento por si le interesa.

Dado un documento o un cliente con el nº 000001, yo creo un archivo .txt que se llame:

Blq_Cliente_000001.txt y lo abro en modo shared.

Blq_cliente_000001.txt contiene la informacion del usuario que tiene el documento.

Lo que me di cuenta es que habia que sacar del tema de semaforos la logica de bloqueos rlock(), (nunca probe el multibloqueo) porque el mismo usuario que hace un rlock, puede querer hacer un unlock en otra derivacion del mismo programa:
Ademas con este sistema no es necesario ningun campo de id de la .dbf, ni tampoco identificar las estaciones de trabajo)

Voceto: Hay que añadir un array statico con los cid y los nHandle para cerrar:

FUNCTION Semaforo(cFile, cId, lSemaforo)
Local cFile:= cPath+ "Blq_"+ cFile+ "_"+ cId

IF lSemaforo
IF !File(cFile) .OR. lUsado(cFile)
ELSE
ENDIF
ELSE
DELETE FILE (cFile)
ENDIF
RETURN NIL

Saludos
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor rochinha » 26 Mar 2011 17:29

Atenção,

Para que o tópico siga o rumo inicial sugiro que sejam postadas apenas soluções e implementações. Caso não irei tranca-lo.

Obrigado.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Re: DICA: Uso de semaforo em sistemas com Fivewin.

Mensagempor Eric.Developer » 26 Mar 2011 18:54

Poste dicas que tiver vontade, independente da importancia, erros e opiniões alheias.

Tenho coisas a ensinar, nem por isso me dou ao trabalho de ficar questionando ponto de vista, lógica, etc, nem que me pedisse, é tempo perdido, vejo vocês se estapeando por nada e dou risada. A única razão que motivou minha postagem, é que para justificar seu código, você teve a infeliz idéia de afirmar um fato incorreto referente a um recurso da linguagem, RLOCK. Experiências ruins, sei lá há quantas décadas, não é motivo para generalizações sobre a linguagem, até exemplifiquei um fato.

Sua afirmação dá idéia errada para alguns profissionais e principalmente aos novatos, você que possui muito tempo de experiência deveria se preocupar com a qualidade da informação. Desculpe, mas de uma forma que não gostou muito, tentei ajudar, sem precisar de códigos.

rochinha escreveu:Se um dia sentarmos para discutir programação, que seja numa mesa de bar, bebendo e gargalhando.

Credo, que não seja de xBase, gosto de novidades, cinema. Prefiro jogar tênis, truco, SSF4 no PlayStation3 (aff me acabo onLine).
:D
Delphi, SQL, FastReport | Xailer VxH Fivewin Minigui Hwgui [x]Harbour
Contate-me: Desenvolvimentos em geral | Treinamentos
Overview/Download: Xailer / Harbour Ferramenta profissional e mais completa.
Avatar de usuário

Eric.Developer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 31 Ago 2010 22:16
Curtiu: 0 vez
Mens.Curtidas: 8 vezes




Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro