Página 1 de 1

O que destruir de uma classe ao encerrar a classe?

Enviado: 04 Mar 2022 19:56
por JoséQuintas
Existe a necessidade de destruir alguma coisa na classe ao encerrar a classe?
Ou isso é só pra componentes GUI?

O que destruir de uma classe ao encerrar a classe?

Enviado: 05 Mar 2022 09:16
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.

O que destruir de uma classe ao encerrar a classe?

Enviado: 05 Mar 2022 16:13
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.

O que destruir de uma classe ao encerrar a classe?

Enviado: 07 Mar 2022 11:57
por vailton
Eu não uso ADO... qual a funcao do Harbour voce usou para criar "conexao"?

O que destruir de uma classe ao encerrar a classe?

Enviado: 07 Mar 2022 19:38
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" )

O que destruir de uma classe ao encerrar a classe?

Enviado: 07 Mar 2022 19:45
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.

O que destruir de uma classe ao encerrar a classe?

Enviado: 09 Mar 2022 15:55
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.

O que destruir de uma classe ao encerrar a classe?

Enviado: 09 Mar 2022 18:27
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

O que destruir de uma classe ao encerrar a classe?

Enviado: 11 Mar 2022 07:30
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.

O que destruir de uma classe ao encerrar a classe?

Enviado: 06 Out 2022 10:00
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


O que destruir de uma classe ao encerrar a classe?

Enviado: 06 Out 2022 10:05
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...