AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datamodule richtig Frei geben
Thema durchsuchen
Ansicht
Themen-Optionen

Datamodule richtig Frei geben

Ein Thema von renekr · begonnen am 14. Aug 2007 · letzter Beitrag vom 14. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#1

Datamodule richtig Frei geben

  Alt 14. Aug 2007, 10:30
Datenbank: SQL Server • Version: 2005 STD • Zugriff über: ADO
Hallo,

Ich habe ein kleines Problem.

Ich habe mehrere Datamodules in meinem Project und erzeuge die zur Laufzeit mit:
Delphi-Quellcode:
DMStart:= TDataModule8.Create(nil);
 DMStart.ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=yxyxyxyx;Persist Security Info=true;User ID='+Databasename+';Initial Catalog='+Databasename+';Data Source='+Server;
 DMStart.ADOConnection1.connected:=true;
Nun will ich diese beim Beenden der Application wieder freigeben udn auch zwischendrin weil ich untershciedliche Datamoduls für einzelne Bereiche verwende.
Deshalb will ich nicht so viel offen lassen.

Das ganze mache ihc mit :

Delphi-Quellcode:
 if DMLagerKA <> Nil then
  begin
  DMLagerKA.ADOConnection1.Connected:=false;
  DMLagerKA.Free;
  end;
Nun ist es so das wenn ich das Datamodule erzeugt habe und es im laufe der anwendung free mache ,kracht es am Schluss weil er in die Routine reinrennt.

Kann mir da jemand nen Tip geben wie ich das sauber ,elegant Lösen kann
?

mfg
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#2

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 11:03
Hi,
wenn du an mehreren Stellen deines Programmes das Datamodul freigibst dann solltest du nicht mit


Free arbeiten.
Objekt.Free prüft intern schon ob das Objekt noch eine Referenz hat (aber nicht ob diese auch gültig ist)

angenommen du mach das:
Delphi-Quellcode:
MeinObjekt.Free; // Objekt freigeben
....

...

..
Programm Beenden:

Delphi-Quellcode:
MeinObjekt.Free; // hier knallst (MeinObjekt hat jetzt noch eine Referenz auf einen Speicherplatz, aber das Objekt ist schon
//freigegeben.


Du solltest besser folgendes machen:

Delphi-Quellcode:
FreeAndNil ( MeinObjekt ); // Objekt wird zerstört und Objektreferenz wird auf NIL gesetzt
..
..
..
MeinObjekt.Free; // hier knallst jetzt nicht, da intern auf <>NIL geprüft wird, d.h. das Objekt ist NIL und es wird
//kein Destruktor aufgerufen
Solltest du noch fragen haben, helfe ich dir gerne

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 11:47
Hi,
Vielen Dank.
nun gehts ohne Fehler.

Kannst du mir ev. noch nen kleienr Tip pgeben.
Wenn nich bei mir nachdem ich alles free and nill am Schluss beim onclose event gemacht habe hängt das Tool manchmal einige Sekunden ab und zu a länger fast bei 100 % CPU und i kan nden PC nicht mehr bedienen sogar die Maus ruckelt nur noch.

danke.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#4

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 11:54
Hallo,

das ist ein bisschen schwer so aus der Ferne

zeig doch mal dein OnClose Event, dann können wir uns das mal angucken.
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 12:04
Hi,
also das is net einfach !*G*G

Ich habe 1 Splashscreen,dieser wird beim start als art info + Ladefortschritt gezeigt dann visible false und wenn man in der Hauptform close macht dann kommt er wieder hoch.

In der Splashform ist ein Timer der folgendes macht.
Delphi-Quellcode:

procedure TForm14.CloseMekm;
begin
try
LEDMeter(15);

LEDMeter(20);
DMStart:= TDataModule8.Create(nil);
  DMStart.ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=xyxyxy;Persist Security Info=true;User ID='+Databasename+';Initial Catalog='+Databasename+';Data Source='+Server;
  DMStart.ADOConnection1.connected:=true;
LEDMeter(15);

DMStart.ADOQuery2.Active:=false;
DMStart.ADOQuery2.sql.text:='select * from '+Tool_Name+' where (Novelluser='+QuotedStr(GetUserName)+') and (Computername='+QuotedStr(ComputerName)+')';
DMStart.ADOQuery2.Active:=true;
LEDMeter(20);

except
end;


try
application.ProcessMessages;
DMStart.ADOCommand1.CommandText:='update '+Tool_Name+' set login = '+QuotedStr('0')+' where (ID ='+QuotedStr(DMStart.ADOQuery2.FieldValues['ID'])+')';
DMStart.ADOCommand1.Execute;

LEDMeter(20);


if LoginUser<> ''then
begin
  if eingeloggt = false then // Weil der Wert False vor dem Einloggen abgefragt wird, wenn er schu trrue ist is jemand eingeloggt
  begin
  DMStart.ADOCommand1.CommandText :='update Personaldaten set Eingeloggt='+QuotedStr('0')+' ,Workstation='+QuotedStr('')+' where (Personalnummer ='+QuotedStr(Personalnummer)+')' ;
  DMStart.ADOCommand1.Execute;
  end;
end;

//Delay(500);
except
end;

try
 // ani.Terminate;

LEDMeter(25);

DMStart.ADOConnection1.connected:=false;
DMStart.Free;
Disconnect_Connections;
      
close;

except
end;

end;
In den Disconnect_Connections prüfe ich ob die datamodule auf sind und dann freeandnil.
Ich habe den gesamten source auch schon ausgeklammert aber es hängt immer noch.

Zudem hab i noch das Thema wenn ich in einer Form ein Datamodule generiere ,das ich dann zb.: wenn ich eine andere Form auf mache nicht auf das Module zugreifen kann,deswegen muss i es erst nochmal erzeugen.

Danke.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 12:09
Ich hab mal ne Frage zu
folgendem Codestück:


Zitat:
DMStart.ADOConnection1.connected:=false;
DMStart.Free;
Disconnect_Connections;
Hier setzt du deine ADO Connection auf false, un gibst dann das ganze Datenmodulfrei (indem ja auch deine ADO Connection liegt,
richtig?

Aber was macht dann deine Funktion Discconnect_Connections?
Könntest du die auch posten?

Denn wenn die auf eine Connection im Datenmodul zugreifen will könnte es hier auch krachen!

Gruß
DelphiManiac
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 12:39
grundsätzliche Frage : warum wird das Datamodul überhaupt zur Laufzeit erzeugt ?
Gruß
Hansa
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 12:46
Hi,
also hier der Code:

Delphi-Quellcode:

procedure Disconnect_Connections;
begin

case Active_Connn of
0:begin //Lager KA
  if DMLagerKA <> Nil then
  begin
  DMLagerKA.ADOConnection1.Connected:=false;
  FreeAndNil (DMLagerKA);
  end;
end;

1:begin //Lager SC
 if DMLagerSC <> Nil then
  begin
  DMLagerSC.ADOConnection1.Connected:=false;
  FreeAndNil (DMLagerSC);
  end;
end;

2:begin //Lager
  if DMLager <> Nil then
  begin
  DMLager.ADOConnection1.Connected:=false;
  FreeAndNil (DMLager);
  end;
end;

3:begin //Spiesse
  if DMSpiesse <> Nil then
  begin
  DMSpiesse.ADOConnection1.Connected:=false;
  FreeAndNil (DMSpiesse);
  end;
end;

4:begin //Logbuch
  if DMlogbuch <> Nil then
  begin
  DMlogbuch.ADOConnection1.Connected:=false;
  FreeAndNil (DMlogbuch);
  end;
end;

8:begin //System
if DMSystem <> Nil then
begin
DMSystem.ADOConnection1.Connected:=false;
DMSystem.ADOConnection_System_DB.Connected:=false;
FreeAndNil (DMSystem);
end;
end;

13:begin //feeder
if DMFeeder <> Nil then
begin
DMFeeder.ADOConnection1.Connected:=false;
FreeAndNil (DMFeeder);
end;
end;

121:begin //Lager Lager Spiesse
  if DMSpiesse <> Nil then
  begin
  DMSpiesse.ADOConnection1.Connected:=false;
  FreeAndNil (DMSpiesse);
  end;
    if DMLager <> Nil then
  begin
  DMLager.ADOConnection1.Connected:=false;
  FreeAndNil (DMLager);
  end;
end;

122:begin //Lager Lager SC Spiesse
  if DMSpiesse <> Nil then
  begin
  DMSpiesse.ADOConnection1.Connected:=false;
  FreeAndNil (DMSpiesse);
  end;
    if DMLager <> Nil then
  begin
  DMLager.ADOConnection1.Connected:=false;
  FreeAndNil (DMLager);
  end;
   if DMLagerKA <> Nil then
  begin
  DMLagerKA.ADOConnection1.Connected:=false;
  FreeAndNil (DMLagerKA);
  end;
end;

123:begin //Lager Lager SC Spiesse
  if DMSpiesse <> Nil then
  begin
  DMSpiesse.ADOConnection1.Connected:=false;
 FreeAndNil (DMSpiesse);
  end;
    if DMLager <> Nil then
  begin
  DMLager.ADOConnection1.Connected:=false;
  FreeAndNil (DMLager);
  end;
   if DMLagerSC <> Nil then
  begin
  DMLagerSC.ADOConnection1.Connected:=false;
  FreeAndNil (DMLagerSC);
  end;
end;

end;


end;
Die Active_Connn setze ich im Tool um nur die aktuellen Module freizugeben.

Krachen tuts am schluß net mehr da durch.
Das Tool hängt nur bei 100% und macht nix mehr.
manchmal a 1 minute selbst in der IDE.

@Hansa: Das hab i mal so gemacht damit ich nicht alle Datamodule am start erzeuge.
Weil das Programm in vielen richtugnen genutzt wird und so nicht immer alle auf sein müssen.
danke
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 14:30
Ein Datamodul tut dir doch nichts. Allerdings habe ich die Befürchtung, dass du Datamodul und DB-Tabellen verwechselt. Pro Tabelle ein Datamodul oder wie ? Lasse von mir aus die Tabellen zu, aber gruppiere sie zumindest sinnvoll in Datamodulen. Für mehrere (verwandte) Programme auf gleicher Datenbasis, davon 2 wichtige größere habe ich 4 Datamodule. Ein allgemeines, das enthält z.B. Database, Transactions, gemeinsam benötigte Tabellen usw. was jedes Programm eben braucht. Dann 2 weitere für die beiden Programme. Da sind hauptsächlich Datasets für das eine oder das andere Programm drin. Das 4. DM enthält nur SPs. Das spalte ich allerdings noch in 2 DMs auf. Dann ist aber wirklich bei 5 DMs (vorerst) Schluss. Für ca. 60 Tabellen, 180 Trigger, 80 SPs usw. reicht das völlig aus.
Gruß
Hansa
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Datamodule richtig Frei geben

  Alt 14. Aug 2007, 14:56
Hi,
leider verwechsle i das nicht *GG*

I habe auch so 6-7 Datamodules die connections,ADOQuerys und Datasources beinhalten.

Ich arbeite viel mit DB Kompos also speichere die daten nicht zwischen.
Ich wollte halt die DM nicht creieren wenn i sie nicht benötige ,oder der user sie nicht braucht.

Aber über einige Tips zur Optimierung der SQL Anbindung wäre ich sehr interessiert da das a noch eine schachstelle ist.

Aber das erklärt immer noch nicht die 100% CPU Auslastung beim close.

mfg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz