Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8076[/thread]

In gleiche Referenz speichern...

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
zipster
 2006-06-12 15:36
#67237 #67237
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe ein kleines Referenz Problem.
In meine Programm ist nun eine Möglichkeit durch die Einträge zu blättern, hierdurch habe ich nun aber ein Problem und zwar legt mein Programm eine neue Referenz statt in die alte zu schreiben.

Ne Lösung hätte ich schon parat, ich könnte jeden Eintrag im alten ReferenzHash mit einem neuen Ersetzen. Das wollte ich aber nicht machen dass das Blättern jetzt schon viel zu langsam ist.

Ich hoffe mal dass ihr eine andere Lösung für mich habt.

Gruß
Seri aka zipster
esskar
 2006-06-12 15:43
#67238 #67238
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mach mal ein beispiel!
zipster
 2006-06-12 16:06
#67239 #67239
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Ich versuchs mal...

Als erstes befülle ich die REF
Code: (dl )
$ref_hash_haupt             = &datensatz_von_datenbank_laden( $dbh, "select * from kontakte where ID = ?", $id, "fetchrow_hashref", "");

Danach baue ich die Gui auf
Code: (dl )
&kontaktfenster_inhalt_aufbauen($frame_kontakte_haupt, \%{$ref_hash_haupt}, $registerkarte,....


In der Gui gibt es die Blätter und die Speicher Funktion
Code: (dl )
1
2
3
$frame_kontakte_haupt->Button(-text => '>>', -command => [\&naechster_Datensatz, $ref_hash_haupt->{'id'}, $frame_kontakte_haupt, \%{$ref_hash_haupt}, $registerkarte,....])->grid(-row=>'0', -column=>'5', -sticky => 'w');

$button_speichern=$frame_top_toolbox->Button(-text => "Speichern", -command => sub{&sichern($dbh, "kontakte", \%{$ref_hash_haupt}, "zimmer_id", "zimmer", "fetchrow"), &sichern($dbh, "adresse", \%{$ref_hash_adresse}, "zimmer_id", "zimmer", "fetchall", $ref_hash_haupt->{'id'})},)->grid(-row=>'0', -column=>'2', -sticky => 'w');


Hier noch beide Subs
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
sub naechster_Datensatz{
my ($id, $frame_kontakte_haupt, $ref_hash_haupt, $registerkarte,...) = @_;
my $sth = $dbh->prepare( "SELECT id FROM kontakte WHERE id $zeichen ? LIMIT 1" );
$sth->execute ($id);
my $ref = $sth->fetchrow_hashref();
$sth->finish ();
if ((!defined($ref)) && ($zeichen eq "<")){

$sth = $dbh->prepare( "SELECT id FROM kontakte ORDER BY id DESC LIMIT 1" );
$sth->execute ();
$ref = $sth->fetchrow_hashref();
$sth->finish ();
}
if ((!defined($ref)) && ($zeichen eq ">")){

$sth = $dbh->prepare( "SELECT id FROM kontakte ORDER BY id LIMIT 1" );
$sth->execute ();
$ref = $sth->fetchrow_hashref();
$sth->finish ();
}


$ref_hash_haupt = &datensatz_von_datenbank_laden( $dbh, "select * from kontakte where ID = ?", $ref->{'id'}, "fetchrow_hashref", "");

for my $item($frame_kontakte_haupt->children()){
$item->destroy();
}
for my $item($registerkarte->children()){
$item->destroy();
}
for my $item($frame_top_toolbox->children()){
$item->destroy();
}

print "ID_HASH $ref_hash_haupt->{'id'}\n";
&kontaktfenster_inhalt_aufbauen($frame_kontakte_haupt, \%{$ref_hash_haupt}, $registerkarte,...);

}#naechster_Datensatz

sub sichern{
my ($dbh, $tabellen_name, $hash_ref, $typ_fuer_browseentry, $tabelle_fuer_browseentry, $art_der_sicherung, $id_von_hauptkontakt) = @_;
my ($sql, $zeilen_bezeichnung, @array, $zeile, $values);
#$hash_ref = typ_in_wert_wandeln(\%{$hash_ref}, $typ_fuer_browseentry, $tabelle_fuer_browseentry, $dbh, "id", "beschreibung");
if ($art_der_sicherung eq "fetchall"){
my $sth_id_kontrolle =$dbh->prepare ("select id from $tabellen_name");
$sth_id_kontrolle->execute ();
my $id_kontrolle = $sth_id_kontrolle->fetchall_hashref('id');
$sth_id_kontrolle->finish();
foreach my $datensatz_id (sort keys(%{$hash_ref})) {
if (defined($id_kontrolle->{$datensatz_id})){
foreach $zeilen_bezeichnung (keys(%{$hash_ref->{$datensatz_id}})) {
$sql .= "," if $sql;
$sql .= "$zeilen_bezeichnung"." = ?";
$values = Encode::encode ("ISO-8859-1", $hash_ref->{$datensatz_id}->{$zeilen_bezeichnung});
push (@array, "$values");
}
push (@array, $datensatz_id);
$sql = "UPDATE $tabellen_name SET $sql WHERE id = ?";
$dbh->do ($sql, undef, @array);
undef $sql;
undef @array;
}
else {
print "INSERT";
foreach $zeilen_bezeichnung (keys(%{$hash_ref->{$datensatz_id}})) {
next if (!defined ($hash_ref->{$datensatz_id}->{$zeilen_bezeichnung}));
$sql .= "," if $sql;
$sql .= "$zeilen_bezeichnung"." = ?";
$hash_ref->{$datensatz_id}->{'kontakte_id'} = $id_von_hauptkontakt;
$values = Encode::encode ("ISO-8859-1", $hash_ref->{$datensatz_id}->{$zeilen_bezeichnung});
push (@array, "$values");
}
push (@array, $datensatz_id);
$sql = "INSERT INTO $tabellen_name SET $sql" if (defined ($sql));
print "\n\n $sql \n\n";
if (defined ($sql)){
$dbh->do ($sql, undef, @array);
}
undef $sql;
undef @array;
#$hash_ref = &leere_zeilen_an_hlist_anhaengen( $dbh, "select * from $tabellen_name where kontakte_id = ?", $id_von_hauptkontakt, \%{$hash_ref});
}

}
}
elsif($art_der_sicherung eq "fetchrow"){
if (defined($hash_ref->{'id'})){
foreach $zeilen_bezeichnung (keys(%{$hash_ref})) {
$sql .= "," if $sql;
$sql .= "$zeilen_bezeichnung"." = ?";
$values = Encode::encode ("ISO-8859-1", $hash_ref->{$zeilen_bezeichnung});
push (@array, "$values");
}
push (@array, $hash_ref->{'id'});
$sql = "UPDATE $tabellen_name SET $sql WHERE id = ?";
print @array;
$dbh->do ($sql, undef, @array);
undef $sql;
undef @array;
}
else {
foreach $zeilen_bezeichnung (keys(%{$hash_ref})) {
next if (!defined ($hash_ref->{$zeilen_bezeichnung}));
$sql .= "," if $sql;
$sql .= "$zeilen_bezeichnung"." = ?";
$values = Encode::encode ("ISO-8859-1", $hash_ref->{$zeilen_bezeichnung});
push (@array, "$values");
}
$sql = "INSERT INTO $tabellen_name SET $sql" if (defined ($sql));
print "\n\n $sql \n\n";
if (defined ($sql)){
$dbh->do ($sql, undef, @array);
}
undef $sql;
undef @array;
}

}

}

}#sichern



Die Speicherfunktion funktioniert super bis geblättert wird. Denn dann ist in der Speicherfunktion immer noch die alte ref. Und bei jedem Blättern erhöht sich auch die Speichernutztung meines Programms.
zipster
 2006-06-13 16:53
#67240 #67240
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Kann mir keiner weiterhelfen? :(

Speichern kann ich jetzt auch wenn geblättert wurde. Dieses habe ich geschafft indem ich das übergeben an die Subs wegelassen habe.
Code: (dl )
...\%{$ref_hash_haupt}...


ABER trotzdem erhöht sich pro Blättern der Speicherverbrauch meines Programms und es wird immernoch eine neue Referenz angelegt.

Kann man Perl nicht irgendwie sagen das er die alte Referenz überschreiben oder löschen soll?
pktm
 2006-06-13 18:06
#67241 #67241
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hm, hast du es schonmal mit undef $referenz versucht?

Dann arbeitest du wohl mit Tk? Da kann man Widgets manchmal auch explizit schließen (z.B. mit destroy())
http://www.intergastro-service.de (mein erstes CMS :) )
zipster
 2006-06-13 18:28
#67242 #67242
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
JUCHU eine Antwort :p

Ja habs mit Undef schon probiert, aber bringt garnichts ausser das es dann noch langsamer ist.

Ich arbeite mit TK und ich benutzte destroy() an gewissen Stellen. Aber in den Referenzen stehen ja Daten aus der Datenbank.\n\n

<!--EDIT|zipster|1150208950-->
pktm
 2006-06-13 18:53
#67243 #67243
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hast du schonmal probiert die Werte, auf die referenziert wird zu leeren ($referenz{xy} = undef;)?
Weil, eine Referenz ist meines Wissens nur einZeiger, die Datenstehen wo anders. Wenn du jetzt den Zeiger löschst müssten die Daten bis zur Müllsammlung doch irgendwie erhalten bleiben...
http://www.intergastro-service.de (mein erstes CMS :) )
zipster
 2006-06-14 10:54
#67244 #67244
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Jop so wurde mir das auch erklärt, Referenz ist nur ein Zeiger der auf eine Speicheradresse zeigt und dort steht dann alles drin.

Habe es mit
Code: (dl )
1
2
3
foreach (keys(%{$referenz})){
$referenz{$_} = undef;
}

versucht. Das Programm verhält sich aber genauso wie vorher(nur das dass Blättern langsamer ist)
GwenDragon
 2006-06-14 12:29
#67245 #67245
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
[quote=zipster,14.06.2006, 08:54]Jop so wurde mir das auch erklärt, Referenz ist nur ein Zeiger der auf eine Speicheradresse zeigt und dort steht dann alles drin.

Habe es mit
Code: (dl )
1
2
3
foreach (keys(%{$referenz})){
$referenz{$_} = undef;
}

versucht. Das Programm verhält sich aber genauso wie vorher(nur das dass Blättern langsamer ist)[/quote]
Wie wäre es mit undef %$referenz;, das ist schneller.
Dann ist der Hash weg.\n\n

<!--EDIT|GwenDragon|1150273825-->
zipster
 2006-06-14 12:47
#67246 #67246
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Speicherausnutztung steigt trotzdem mit jedem Blättern. Das bedeutet doch das die alte Referenz noch da ist und einfach nur ne neue dazukommt oder täusche ich mich?
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-06-12 15:36.