O que destruir de uma classe ao encerrar a classe?

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

O que destruir de uma classe ao encerrar a classe?

Mensagem por JoséQuintas »

Existe a necessidade de destruir alguma coisa na classe ao encerrar a classe?
Ou isso é só pra componentes GUI?
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/
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por vailton »

Depende de como foi implementada a classe José.

Imagine uma classe que abre uma conexão socket, um DBF, criou ou abriu um RESOURCE, uma conexão com o banco, etc... o mínimo que se espera é que a classe ao morrer, feche estes recursos apropriadamente para liberar recursos de RAM, do sistema operacional, etc. para que, entre outras coisas, possa viabilizar o reuso dos recursos computacionais.

Agora se sua classe foi programada apenas para calculo, por exemplo, e usa tudo como propriedades e nao abre ou não utiliza nenhum outro recurso do SO, COM, etc tudo isto é algo que pode ser desnecessário.

Agora um detalhe importante: no Harbour existem vários "destructors" implementados para ajudar o programador "distraído" (que esquece de fechar algo) e os encerra corretamente quando não estão mais em uso, um bom exemplo é usado pela classe de SQLite. Este tipo de implementação auxilia pois fecha o que for necessário e te ausenta da responsabilidade, maaaas, note que é algo ainda da forma como foi implementado... O ideal é: se abriu feche, se alocou libere e por aê vai.

Espero ter ajudado.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

O que destruir de uma classe ao encerrar a classe?

Mensagem por JoséQuintas »

Minha classe pra ADO não cria conexão, apenas usa a existente.
Mas, não sei ao certo o que acontece com o recordset.

Código: Selecionar todos

rs := conexao:Execute( cSQL )
É o retorno do comando Execute() na conexão.
A conexão é configurada como lado do cliente.
O retorno é formato recordset somente leitura e acesso sequencial.
Costumo fechar no final, mas sempre existe a possibilidade de ter esquecido.

No VB6 tinha lá o SET RS = Nothing, porque VB6 era interpretado, e as variáveis não eram destruídas automaticamente.
No Harbour supõe-se que a destruição seja eficiente, inclusive nesses casos.
Mas num recordset não fechado, ou numa OLE, não sei o que se passa por trás do programa.
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/
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por vailton »

Eu não uso ADO... qual a funcao do Harbour voce usou para criar "conexao"?
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

O que destruir de uma classe ao encerrar a classe?

Mensagem por JoséQuintas »

Código: Selecionar todos

cnSQL := win_OleCreateObject( "ADODB.Connection" )
Basicamente criar a conexão, configurar, e usar o tempo todo, com cnSQL:Execute( "comando" )
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

O que destruir de uma classe ao encerrar a classe?

Mensagem por JoséQuintas »

Uso com Excel, mas não sei porque, os arquivos que vém da ANP preciso abrir no OpenOffice e salvar em formato Excel.

Código: Selecionar todos

FUNCTION ExcelConnection( cFileName, cVersion )

   LOCAL oConexao

   DO CASE
   CASE ValType( cVersion ) == "C"
   CASE ".xlsx" $ Lower( cFileName ); cVersion := "12.0 Xml" // XLSX
   //CASE "t00" $ Lower( cFileName )  ; cVersion := "5.0"  // 95
   OTHERWISE                        ; cVersion := "8.0" // 97/2000/XP
   ENDCASE
   oConexao := win_OleCreateObject( "ADODB.Connection" )
   oConexao:ConnectionString := ;
      [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + cFileName + ;
      [;Extended Properties="Excel ] + cVersion + [;HDR=YES";]

   RETURN oConexao
Uso com MySQL

Código: Selecionar todos

FUNCTION MySQLConnection( cServer, cDatabase, cUser, cPassword, nPort )

   LOCAL cnConnection, cString

   hb_Default( @nPort, 3306 )
   cString := iif( win_OsIs10(), "Provider=MSDASQL;", "" )
   IF IsOdbcVelho()
      cString += "Driver={MySQL ODBC 3.51 Driver};"
   ELSE
      cString += "Driver={MySQL ODBC 5.3 ANSI Driver};"
   ENDIF
   cString += "Server=" + cServer + ";" + ;
      "Port=3307;" + ;
      "Stmt=;"    + ;
      "Database=" + cDatabase + ";" + ;
      "User="     + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=latin1_swedish_ci;" + ;
      ; // "SCHEMANOERROR=1;" + ;
      "AUTO_RECONNECT=1;" + ;
      "COMPRESSED_PROTO=0"
      // "PAD_SPACE=1;" + ; // omitido 2022.02.17

   cnConnection := win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString  := cString
   cnConnection:CursorLocation    := AD_USE_CLIENT
   cnConnection:CommandTimeOut    := 600 // seconds
   cnConnection:ConnectionTimeOut := 600 // seconds

   RETURN cnConnection
Usei no ADS, pra conectar DBF/CDX

Código: Selecionar todos

FUNCTION ADSConnection( cPath )

   LOCAL oConexao := win_OleCreateObject( "ADODB.Connection" )

   oConexao:ConnectionString := "Provider=Advantage OLE DB Provider;" + ;
      "Mode=Share Deny None;" + ;
      "Show Deleted Records in DBF Tables with Advantage=False;" + ;
      "Data Source=" + cPath + ";Advantage Server Type=ADS_Local_Server;" + ;
      "TableType=ADS_CDX;Security Mode=ADS_IGNORERIGHTS;" + ;
      "Lock Mode=Compatible;" + ;
      "Use NULL values in DBF Tables with Advantage=True;" + ;
      "Exclusive=No;Deleted=No;"
   oConexao:CursorLocation := AD_USE_CLIENT
   oConexao:CommandTimeOut := 20

   RETURN oConexao
Usei pra abrir os arquivos SQLITE, do player MediaMonkey, como teste

Código: Selecionar todos

FUNCTION SQLiteConnection( cFileName )

   LOCAL oConexao := win_OleCreateObject( "ADODB.Connection" )

   oConexao:ConnectionString := iif( win_OsIs10(), "Provider=MSDASQL;", "" ) + ;
      "Driver={SQLite3 ODBC Driver};Database=" + cFileName + ";"
   oConexao:CursorLocation := AD_USE_CLIENT
   oConexao:CommandTimeOut := 20

   RETURN oConexao
Lembrando que depende de instalar o ODBC de cada um.
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/
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por vailton »

cnSQL := win_OleCreateObject( "ADODB.Connection" )
....
Basicamente criar a conexão, configurar, e usar o tempo todo, com cnSQL:Execute( "comando" )
José pelo codigo fonte que li aqui, o Harbour já tenta liberar a memória automaticamente quando a variavel criada com win_OleCreateObject() é destruida.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

O que destruir de uma classe ao encerrar a classe?

Mensagem por JoséQuintas »

vailton escreveu:José pelo codigo fonte que li aqui, o Harbour já tenta liberar a memória automaticamente quando a variavel criada com win_OleCreateObject() é destruida.
Achei que estava perguntando por outro motivo.

O problema era lá em GUI, onde quem tem controle é o Windows, e não o programa ou a classe.
O Harbour destrói o que pertence à classe, mas naquele caso, a imagem pertence ao gerenciamento do Windows, relacionado com a janela.

E em multithread não deu problema, porque o próprio Windows já "dá uma varrida" no lixo que uma thread pode ter deixado, destruindo a janela e tudo que pertencia a ela.

Serve até aquele comentário que faço de vez em quando:
Multithread é como EXE separado, principalmente se tiver janela própria.
Fechou o EXE separado/thread/janela, fechou tudo, e o sistema operacional faz limpeza.

Fico até pensando se não é mais interessante usar multithread.... já manda muito problema pro espaço.... kkkk
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/
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por vailton »

Sim, entendo. É uma opção, eu prefiro a outra que é como você fez: escrutinar o código e torná-lo melhor, mais robusto e maduro.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por clodoaldomonteiro »

Bom, ao final de toda interação com o banco de dados, costumo usar o método close() para fechar e atribuo NIL para as variáveis.
Abrindo uma planilha Excel e usando SQL para processamento:

Código: Selecionar todos

      oConexao := CreateObject( "ADODB.Connection" )
      oConexao:ConnectionString := [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + mArq_ + [;Extended Properties="Excel 12.0 Xml; HDR=Yes";] //IMEX=1";]
      oConexao:Open()  
      rs := oConexao:Execute( "SELECT * FROM [report1$]" )
      ...
      ...
      Do While ...
         ...
         ...
         rs:MoveNext()
      Enddo

      rs:Close()
      oConexao:Close()

      oConexao := NIL
      oRs      := NIL

      SETCURSOR(cur_atual)
      DbCloseAll()

   END SEQUENCE

At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

O que destruir de uma classe ao encerrar a classe?

Mensagem por clodoaldomonteiro »

Aproveitando a Vailton está de volta.
vailton escreveu:Sim, entendo. É uma opção, eu prefiro a outra que é como você fez: escrutinar o código e torná-lo melhor, mais robusto e maduro.
O Sr. tem planejado atualizar a xDevStudio 0.70, pois sou usuário dela faz muito tempo.
Abraços...
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder