O que destruir de uma classe ao encerrar a classe?
Moderador: Moderadores
- JoséQuintas
- 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?
Existe a necessidade de destruir alguma coisa na classe ao encerrar a classe?
Ou isso é só pra componentes GUI?
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/
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/
O que destruir de uma classe ao encerrar a classe?
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.
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
"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
- JoséQuintas
- 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?
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.
É 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.
Mas, não sei ao certo o que acontece com o recordset.
Código: Selecionar todos
rs := conexao:Execute( cSQL )
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/
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/
O que destruir de uma classe ao encerrar a classe?
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
"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
- JoséQuintas
- 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?
Código: Selecionar todos
cnSQL := win_OleCreateObject( "ADODB.Connection" )
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/
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/
- JoséQuintas
- 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?
Uso com Excel, mas não sei porque, os arquivos que vém da ANP preciso abrir no OpenOffice e salvar em formato Excel.
Uso com MySQL
Usei no ADS, pra conectar DBF/CDX
Usei pra abrir os arquivos SQLITE, do player MediaMonkey, como teste
Lembrando que depende de instalar o ODBC de cada um.
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
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
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
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
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/
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/
O que destruir de uma classe ao encerrar a classe?
José pelo codigo fonte que li aqui, o Harbour já tenta liberar a memória automaticamente quando a variavel criada com win_OleCreateObject() é destruida.cnSQL := win_OleCreateObject( "ADODB.Connection" )
....
Basicamente criar a conexão, configurar, e usar o tempo todo, com cnSQL:Execute( "comando" )
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
"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
- JoséQuintas
- 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?
Achei que estava perguntando por outro motivo.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.
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/
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/
O que destruir de uma classe ao encerrar a classe?
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
"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
- clodoaldomonteiro
- 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?
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:
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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
- clodoaldomonteiro
- 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?
Aproveitando a Vailton está de volta.
Abraços...
O Sr. tem planejado atualizar a xDevStudio 0.70, pois sou usuário dela faz muito tempo.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.
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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
