Erro com a funcao Flock()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Erro com a funcao Flock()

Mensagem por rubens »

Olá...

Estou tento um problema com a função flock() ou estou usando errado.

Código: Selecionar todos

// LIMPA ARQUIVO DE NFC TEMPORARIO
DBSelectArea('NFC2')
WHILE(.T.)
	IF FLOCK()
		ZAP
		DBUnlock()
		EXIT
	ENDIF
ENDDO


Pelo debug eu consigo ver que selecionou a area certinha, o Flock() retorna verdadeiro, mas na hora do zap dá erro DBFCDX/1023 uso exclusivo requerido. O arquivo está na pasta atual, está sendo usado somente por um usuário... o Arquivo foi aberto em modo compartilhado.
Tá errado essa forma de usar?
Só posso dar uma zap se o arquivo foi aberto de forma exclusiva?
O Flock() não deveria travar o arquivo para eu poder usar o zap?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro com a funcao Flock()

Mensagem por Jairo Maia »

Olá Rubens,
rubens escreveu:Só posso dar uma zap se o arquivo foi aberto de forma exclusiva?
Sim. Para usar o ZAP o arquivo precisa ser aberto em modo exclusivo. Feche o arquivo, e abra em modo exclusivo. Se você não abre todos os índices ao abrir o arquivo, certifique-se que todos os índices sejam abertos, porque eles também serão zerados, bem como todos arquivos de campos memos relacionados a ele. Após usar o ZAP feche-o novamente e abra em modo compartilhado.
rubens escreveu:O Flock() não deveria travar o arquivo para eu poder usar o zap?
Não. o FLock() trava o arquivo para que nenhum outro usuário altere nada nele, mas não se aplica ao ZAP.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Erro com a funcao Flock()

Mensagem por Kapiaba »

Código: Selecionar todos

   USE BANCO ALIAS BANCO EXCLUSIVE NEW
   DBZAP()

    CLOSE DATABASE
Indexar o aquivo, se necessário.

Não necessita de WHILE... ENDDO.

Abs.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Erro com a funcao Flock()

Mensagem por Eolo »

Tem que usar sempre a NETERR(), que retorna .T. ou .F. se o USE deu certo ou não (aliás, tanto EXCLUSIVE como SHARED).

Porque se o arquivo já estiver em USE por outro usuário na rede, vai dar erro na execução...

Eu uso dentro de um WHILE, porque tento abrir mais de uma vez, abortando só se todas as tentativas derem .F.

Algo como:

Código: Selecionar todos

function abre_excl
abriu=.f.
tenta=1
do whil .t.
  use banco new excl // ALIAS assume o mesmo nome do arquivo
  if neterr()
    * USE EXCL falhou
    * Mensagem pro usuário
    inkey(0.5)
    if tenta=5
      exit
    endi
    tenta++
  else
    * USE EXCL funcionou
    abriu=.t.
    exit
  endi
endd
retu abriu
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro com a funcao Flock()

Mensagem por Pablo César »

Bem lembrado Eolo !
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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Erro com a funcao Flock()

Mensagem por rubens »

Bom dia...

Certo, abrir exclusivo eu já tinha conseguindo... só achei que o flock() travava o arquivo.

Quando se tenta abrir em modo exclusivo e o arquivo já está sendo usado, ele não mostra automaticamente uma mensagem de erro ????

Porque eu uso assim para não deixar o programa ser aberto duas vezes na mesma máquina... tenho um arquivo no d: da máquina e quando entra no programa abre ele em modo exclusivo, daí se tenta entrar no programa de novo ele tenta abrir o mesmo arquivo de novo e dá erro.. na época foi a forma que encontrei.

Bom de qualquer forma....

Obrigado

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro com a funcao Flock()

Mensagem por Jairo Maia »

Olá Rubens,
rubens escreveu:só achei que o flock() travava o arquivo.
Rubens, apenas esclarecendo para você saber a diferença entre um e outro:

A função FLock() realmente bloquei (trava) o arquivo, mas outros usuários podem abri-lo no modo compartilhado para consulta, apenas não vai poder fazer alterações até que o arquivo seja liberado, mas ele consulta o arquivo.

Use <cFile> Exclusive, não permite nem mesmo outro usuário abri-lo para consulta. Ele fica visível apenas para o usuário que abri-lo de forma exclusiva, e para usar o ZAP, isso é necessário, ou seja, que nenhum outro usuário esteja acessando o arquivo.
rubens escreveu:Quando se tenta abrir em modo exclusivo e o arquivo já está sendo usado, ele não mostra automaticamente uma mensagem de erro ????
Não. Ao tentar abrir um arquivo aberto no modo Exclusivo, não provoca um RTE (Run Time Error ou Erro Em Tempo de Execução). Esse erro é retornado pela função NetErr() que retorna .T. quando há erro ao tentar abrir um arquivo, bloquear um arquivo ou bloquear um registro.
rubens escreveu:Porque eu uso assim para não deixar o programa ser aberto duas vezes na mesma máquina...
Enviei há um tempo esse exemplo para poder verificar se determinado processo já está ativo no SO: Funções WAPI no Harbour, mas se quiser pode também usar assim que funciona da mesma forma para seu caso:

Código: Selecionar todos

Function Main()

 EstouRodando()

Return Nil

Function EstouRodando()  // verifica se o sistema está em execução
 
 Local cFileChek := GetEnv( "TEMP" ) + "\ATIVIDADE.SYS"

 If !File( cFileChek )
  Hb_MemoWrit( cFileChek, "Sistema em Execução" )
 EndIf

 FOpen( cFileChek, 16 )  // tenta abrir em modo exclusivo
 If FError() != 0
  Hb_Alert( "Sistema já Aberto nesse Computador;Por Favor, Use a Cópia que está aberta" )
  Quit  // fecha essa cópia do programa
 EndIf

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Erro com a funcao Flock()

Mensagem por Eolo »

Rubens,

Posso parecer piégas mas, enfim, que seja.

Muitos programadores (inclusive eu, anos atrás) elegem o software, dão uma olhada rápida no manual e saem aplicando os comandos e funções, consultando o Google, copiando e colando, sem se preocupar muito com o significado delas ou com o que elas representam. Via de regra por necessidade.

Mas é preciso ir ao gênese, ao começo, entender o espírito da coisa. E nunca perder o link com isso.

Bão, um dia, alguém - sei lá quem foi - criou o Clipper. E ele criou o ZAP, o PACK, o REINDEX, todos representando uma necessidade da "vida real". Sobre o ZAP, imagino ele pensando: "Um prato sobre a mesa, 5 pessoas comendo nesse mesmo prato, aí uma delas resolve limpar o prato, jogar a comida fora, e aí como ficam os outros, com seus garfos espetados no bife? Pra fazer isso, preciso ter controle exclusivo do prato... Feito! Mas e se um outro comensal resolveu fazer a mesma coisa 5 segundos antes?"

Acho que aí nasceu o SET EXCLUSIVE e a NETERR()...

Se eu mando rodar o ZAP e outro(s) usuário(s) está(ão) usando o DBF/CDX, com um browse aberto, o que o browse dos outros iria mostrar como meu ZAP? Pra evitar isso, o EXCLUSIVE assegura que não vai ter mais ninguém com aquele DBF aberto, aí eu posso ZAPear ele. Mas, antes, o NETERR me avisa se alguém já não assumiu, antes, o "controle exclusivo do prato".

Enfim, como diz a música, "tem que se encantar menos com a rede, e mais com o mar".

Programação é lógica, 0's e 1's. Nada a ver com mágica, muito menos com copiar e colar.

Desculpe de novo se pareço piégas.
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Erro com a funcao Flock()

Mensagem por microvolution »

Olá srs. professores... boa tarde!
Hoje e, pela primeira vez, ao tentar usar o PACK via programação, aconteceu comigo essas coisas. Todos foram bem claros quanto às informações e acho que aprendi mais uma coisa, que nos últimos 20 anos nunca havia precisado, utilizado ou aprendido.
As explicações do professor Eolo foram fantásticas, sem esquecer das do Jairo, enfim, de todos.
Vou criar agora uma função/rotina que fecha e abre o arquivo imediatamente caso seja para usar o PACK ou ZAP. Aliás, no meu caso, estou tentando usar o PACk e caí na mesma ideia de trocar o RLOCK por FLOCK, pois, pensava que trocando de uma para outra função, o arquivo seria travado por completo para realização da tarefa.
Meus sinceros parabéns a todos!
:)Pos
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro com a funcao Flock()

Mensagem por JoséQuintas »

Acho que assim fica mais simples e direto:

Vai zerar o arquivo, vai deixar compartilhado para os outros terminais pesquisarem o que?

Mas com certeza, isso já foi dúvida pra todo mundo, inclusive pra mim.
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/
Responder