Página 5 de 5

Erro interno

Enviado: 19 Jun 2014 01:18
por cjp
Não sei usar begin sequence - end sequence, nem multithread, caro Quintas.

A questão é bem mais primária: meu programa usa centenas de .dbf, sendo que vários usuários compartilham os mesmos arquivos em rede. Estou tentando mudar isso; espero que em breve consiga aprender a usar efetivamente mySQL (estou dando os primeiros passos), mas, por enquanto, essa é a minha forma de trabalhar. Frequentemente, um usuário tenta copiar um .dbf em uma pasta onde outro está usando o mesmo .dbf. Daí dá erro de criação do arquivo. Eu queria justamente evitar esse erro. Queria uma forma de, em caso de a base estar em uso, ele esperasse a base ser liberada para copiá-la; ou, ao menos, que ele abandonasse a tentativa de copiar, mas sem dar erro.

Compreendeu?

Erro interno

Enviado: 19 Jun 2014 02:24
por JoséQuintas
Revise a lógica.
Porque usuários precisam copiar o dbf?
Se é pra arquivos temporários, só usar nome diferente.

Erro interno

Enviado: 19 Jun 2014 10:37
por Jairo Maia
Olá Inácio,
cjp escreveu:Faço a verificação antes de tentar salvar, mas pode ser (e acontece com alguma frequência) que um usuário abra a base bem na hora que vou tentar salvá-la, mesmo depois de verificado.

Eu só queria uma forma de isso não causar erro no programa. Ainda que não seja possível salvar, se ele pudesse apenas tentar novamente (ou até abordar a tentativa), mas sem dar erro, seria ótimo. Há algum jeito?
É possível criando um log de proteção, mas para isso, precisaria ver a função que você verifica o arquivo e depois salva. Terá também que fazer uma pequena alteração na sua função UseBase() para aguardar o arquivo ser liberado antes de abri-lo.

Erro interno

Enviado: 20 Jun 2014 14:02
por cjp
De fato eu vou precisar revisar todo o programa, tem muita coisa errada. Esse programa começou a ser feito em 1995, quando eu ainda estava começando a aprender a programar. De lá pra cá, fui alterando algumas coisas, melhorando aqui e ali, mas ainda tem muita coisa velha, que precisa ser mudada. Vou aproveitar que estou começando a usar MySQL para refazer todo o programa, fazer tudo novo, corrigindo todos os velhos defeitos.

Já abandonei o meu errorsys.

Minha usebase() já faz essa verificação, esperando liberar a base:

Código: Selecionar todos

               if upper(exclusivo)#"S" .and. ("ATIV"$upper(nomebase) .or. "NUMEROS"$upper(nomebase) .or. "RODRIGO"$upper(nomebase) .or. "BEATRIZ"$upper(nomebase) .or. "ATCAM"$upper(nomebase) .or. "ATROD"$upper(nomebase) .or. "ATBIA"$upper(nomebase) .or. "PROC"$upper(nomebase) .or. at("COM",upper(nomebase))=1 .or. at("CONSULTA",upper(nomebase))=1 .or. "ARQBX"$upper(nomebase) .or. "RELATOR"$upper(nomebase) .or. "REUS"$upper(nomebase) .or. "TIPOSP"$upper(nomebase) .or. "USUAR"$upper(nomebase) .or. "1"$upper(nomebase) .or. "2"$upper(nomebase) .or. "3"$upper(nomebase)) // .or. upper(curdir())="TAREFAS")
				  vezusb=0
                  if select(bssembarra) = 0
                     use &nomebase. shared //new
                  else
                     DbSelectArea(bssembarra)
				     exit
                  endif
			   else
			      if select(bssembarra) = 0
				     use &nomebase. //new
			      else
                     DbSelectArea(bssembarra)
				     if exclusivo="S"
					    use
					    use &nomebase. //new
				     else
					    exit
					 endif	
			      endif
			   endif	  
               if neterr()
                  vezusb++
                  if ("TAR2P"$upper(hb_progname()) .and. vezusb>120) .or. (at("TAR2P",upper(hb_progname()))=0 .and. vezusb>60)
                     return .f.
                  endif
				  if vezusb=120 .or. vezusb=220 //.or. vezusb=280 .or. vezusb=200 .or. vezusb=240
				     nHand=999
				     if at("TAR2P",upper(hb_progname()))=0
				        nHand := FOpen( "\tarefas\TAR2P.EXE " , 2 )
						fclose(nHand)
				     endif		
				     mandmail1("","Base em uso por "+alltrim(str(vezusb))+" vezes:"+nomebase+"; exclusivo: "+exclusivo+"; área atual: "+alltrim(str(select()))+"; área da base "+nomebase+": "+alltrim(str(select(nomebase)))+"; aliás1: "+alias(1)+"; aliás2: "+alias(2)+"; aliás3: "+alias(3)+"; aliás4: "+alias(4)+"; nhand: "+alltrim(str(nHand))+"; select(nomebase): "+alltrim(str(select(nomebase)))+"; tamanho da base: "+alltrim(str(filesize(nomebase))))
				  endif
                  @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
                  @ maxrow()-1,1 say "Base "+upper(nomebase)+" ocupada; aguarde liberação ("+alltrim(str(vezusb))+")"
				  if us="I"
				     @ maxrow(),1 say "Área: "+alltrim(str(select()))+"; aliás1: "+alias(1)+"; aliás2: "+alias(2)+"; aliás3: "+alias(3)+"; aliás4: "+alias(4)+"; select(nomebase): "+alltrim(str(select(nomebase)))
				  endif
				  inkey(8)
				  @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
                  desiste:=inkey(8)
                  if desiste= 27 //K_ESC
                     conf="N"
                     @ maxrow()-2,1 clear to maxrow(),79
                     @ maxrow()-1,5 say "Confirma abandono da tentativa da utilização?"get conf pict "@!"
                     read
                     @ maxrow()-2,1 clear to maxrow(),79
                     if conf="S"
                        return .f.
                     endif
                  endif
               else
                  exit
               endif
O problema é que o usuário A vai copiar a base pro computador do usuário B. Daí eu mando primeiro ele usar a base, para verificar se ela está disponível. Uma vez aberta a base em modo exclusivo, o que significa que ela não está em uso, eu fecho a base para poder copiar. Nesse exato instante, depois de fechada a base e antes de terminar a cópia, o usuário B abre a base (o que acontece eventualmente). Resultado: a cópia dá erro.

O que eu queria era uma forma de evitar esse erro. No meu errorsys eu havia feito essa opção de, havendo erro de cópia, o programa esperar um pouco e tentar copiar de novo.

Erro interno

Enviado: 20 Jun 2014 19:37
por cjp
Amigos, vejam essa: continua dando o erro, e agora não é questão de recursividade no errorsys:

Código: Selecionar todos

Application Internal Error - C:\agenda\TAGENDA.exe
Terminated at: 2014-06-20 19:32:12
Erro irrecuper vel 6005: Exception error:

    Exception Code:C0000005
    Exception Address:FFF50001
    EAX:01563854  EBX:0156382C  ECX:01530000  EDX:0157E780
    ESI:0022FC40  EDI:00000000  EBP:00000000
    CS:EIP:001B:FFF50001  SS:ESP:0023:0022FBEC
    DS:0023  ES:0023  FS:003B  GS:0000
    Flags:00010202
    CS:EIP:
    SS:ESP: 0041F90D 0156382C 00000001 002A0064 00018804 0000000F 01553C84 002A0064 00543168 005F7907 0156382C 00000000 00547E3D 0156382C 0022FC40 0022FC98

    C stack:
    EIP:     EBP:       Frame: OldEBP, RetAddr, Params...

Modules:
0x00400000 0x00339000 C:\agenda\TAGENDA.exe
0x77C70000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll
0x760D0000 0x000D4000 C:\Windows\system32\kernel32.dll
0x75E40000 0x0004B000 C:\Windows\system32\KERNELBASE.dll
0x76210000 0x000A0000 C:\Windows\system32\ADVAPI32.DLL
0x76F10000 0x000AC000 C:\Windows\system32\msvcrt.dll
0x76020000 0x00019000 C:\Windows\SYSTEM32\sechost.dll
0x77DF0000 0x000A2000 C:\Windows\system32\RPCRT4.dll
0x77870000 0x0004E000 C:\Windows\system32\GDI32.dll
0x77210000 0x000C9000 C:\Windows\system32\USER32.dll
0x762B0000 0x0000A000 C:\Windows\system32\LPK.dll
0x777D0000 0x0009D000 C:\Windows\system32\USP10.dll
0x72CA0000 0x0001C000 C:\Windows\system32\IPHLPAPI.DLL
0x77040000 0x00006000 C:\Windows\system32\NSI.dll
0x72C90000 0x00007000 C:\Windows\system32\WINNSI.DLL
0x6DBD0000 0x0008C000 C:\Windows\system32\ODBC32.dll
0x77670000 0x0015C000 C:\Windows\system32\OLE32.dll
0x77910000 0x0008F000 C:\Windows\system32\OLEAUT32.DLL
0x70320000 0x00051000 C:\Windows\system32\WINSPOOL.DRV
0x77DB0000 0x00035000 C:\Windows\system32\WS2_32.dll
0x772E0000 0x0001F000 C:\Windows\system32\IMM32.DLL
0x77380000 0x000CC000 C:\Windows\system32\MSCTF.dll
0x6D9E0000 0x00038000 C:\Windows\system32\odbcint.dll
0x75BA0000 0x0004C000 C:\Windows\system32\apphelp.dll
0x75820000 0x00017000 C:\Windows\system32\bcrypt.dll
0x753F0000 0x0003D000 C:\Windows\system32\bcryptprimitives.dll
0x641D0000 0x0046A000 C:\Program Files\MySQL\Connector ODBC 3.51\myodbc3.dll
0x75A30000 0x00008000 C:\Windows\system32\Secur32.dll
0x75B80000 0x0001B000 C:\Windows\system32\SSPICLI.DLL
0x6FF70000 0x00007000 C:\Windows\system32\WSOCK32.dll
0x72F40000 0x00010000 C:\Windows\system32\NLAapi.dll
0x6D280000 0x00010000 C:\Windows\system32\napinsp.dll
0x6D260000 0x00012000 C:\Windows\system32\pnrpnsp.dll
0x756D0000 0x0003C000 C:\Windows\System32\mswsock.dll
0x75590000 0x00044000 C:\Windows\system32\DNSAPI.dll
0x6D250000 0x00008000 C:\Windows\System32\winrnr.dll
0x6D220000 0x00025000 C:\Program Files\Bonjour\mdnsNSP.dll
0x6D180000 0x00006000 C:\Windows\system32\rasadhlp.dll
0x740D0000 0x00005000 C:\Windows\System32\wshtcpip.dll
0x756C0000 0x00006000 C:\Windows\System32\wship6.dll
0x72A90000 0x00038000 C:\Windows\System32\fwpuclnt.dll

Called from DBUSEAREA(0)
Called from RECADSQL(18436) in COMUNS.PRG
Called from MAIN(161) in TAGENDA.PRG
O erro no programa (RECADSQL - 18436) eu já resolvi. Mas a questão aqui é o porquê dessa mensagem estranha de erro, e não aquela normal do errorsys?

Erro interno

Enviado: 21 Jun 2014 09:30
por Hasse
Bom dia colegas.

Este erro parece ser do tipo que "atira para todos os lados". Há uma infinidade de motivos que podem ocasionar este erro. Vejam nos link's:

http://blogs.msdn.com/b/calvin_hsia/arc ... 70344.aspx
http://www.youtube.com/watch?v=oJ0hz9JkLgM
http://social.msdn.microsoft.com/Forums ... progeneral
http://forums.2k.com/showthread.php?901 ... e-c0000005

Cada um tem a sua receita para corrigir o citado. Vejam a lista completa no Google:
https://www.google.com.br/?gfe_rd=cr&ei ... 3AC0000005