Autor Beitrag
edelfred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Di 12.09.06 13:50 
Hallo,
ich habe ein Problem mit dem Umgang von einer "grösseren" Datenmenge:
Ich habe ein Signal, das mit 1000Hz abgetastet wird.
Die Messwerte werden in eine TListBox geschrieben. Soweit so gut.
Jetzt versuche ich die gesammelte Datenmenge darzustellen (zB.: mit TDBChart).
Dafür konvertiere ich die Daten aus der TListbox mit einer for schleife in eine tabelle (clientdataset):
(dataset1.append;
dataset1.fieldbyname('name').value:=....;
dataset1.post);
Bei 5000 Werten (sprich 5 Sekunden) warte ich dabei schon ca.2 Minuten.(Ich mag mir gar nicht vorstellen wie lange ich bei 5 MB Daten warten würde)

Also:
Daten->A/D->Tlistbox->Tabelle(clientdataset)->TDBChart dauert ewig!!
(daten->A/D-TListbox geht flott!!!);

Versuche ich die Daten direkt in die Tabelle zu schreiben stürzt mir das Programm mit einer Speicherfehlermeldung ab.
Also:
Daten->A/D->Tabelle(clientdataset)->TDBChart funktioniert nicht!!

Meine Frage:
Warum funktioniert das nicht (Geschwindigkeitsfrage?) und.....
Kann mir jemand einen Tipp geben wie ich die Datenmenge am besten handeln kann, so dass ich nicht ewig und drei Tage warte sobald ich die Daten darstellen möchte.
Besten Dank für alle Antworten und Vorschläge im voraus
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Di 12.09.06 13:58 
sers

wie genau fügst du denn deine werte in dein clientdataset ein? hast du eine datenbank dahinter oder nutzt du quasi ein memory mapped clientdataset?

prinzipiell solltest du doch auch direkt vom messstream in das dataset schreiben können... *kopfkratz*

vielleicht solltest du etwas code offenbaren

C.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 12.09.06 14:08 
Hallo,

ich verstehe die Lösung auch nicht so recht. Wenn du die Daten doch nur anzeigen willst, warum den Umweg über eine Datenbank? Andersrum, wenn die Daten über die Datenbank in eine Grafik sollen, warum den Umweg über eine Listbox?
Grundsätzlich gilt bei größeren Datenmengen (500 gehört aber allerdings nicht dazu) die Daten einer ListBox über OnGetData (o.ä. hab Delphi nicht vor mir) auslesen.
Bei Datenbanken kenn ich mich nicht aus, aber da gibt es eine Möglichkeit Datensätze zwischenzuspeichern und diese dann in einem Ruck zu übertragen, dass ist sicherlich auch schneller.
Allerdings brauchst du meiner Meinung nach weder eine Datenbank noch eine ListBox um die Messwerte in einer TChart darzustellen. Du kannst diese doch direkt einfügen?!

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
edelfred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Di 12.09.06 14:49 
Hallo, danke für die schnellen Antworten..
der Aufforderung nach dem Code komme ich gerne nach...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
For i := 0 To ptFAITransfer.Count - 1 do
  begin
    If (gbDataType) Then         { Spannungs data }
    begin
       tempStr := Format('%3.4f',[single(point^)]);
       Longint(point) := Longint(point) + SizeOf(Single);
    end
    else
       exit;
    Datalist.Items.Add(tempStr);    //ListBox;
    messdaten[i]:= single(point^);  //Array;
  end;

Hier werden die Daten in die Listbox geschrieben (und "Zum etwas ausprobieren" in ein statisches Array).


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin
 for i := 0 to 5000 do  begin       //vorläufiger Wert von 5000;
   clientdataset1.Append;
   clientdataset1.FieldByName('Wert').value:=messdaten[i];
   clientdataset1.Post;
                             end;
end;


@crowley.... ich vermute, ich benutze ein memory mapped dataset.
Ich habe eine Möglichkeit gesucht eine Tabelle als Grundlage einer Datenbank mit delphi2006 zu erstellen. Eine Datenbankoberfläche gibts bei der Version nicht mehr :?: . Also habe ich über TClientDataset eine *.xml datei als Tabelle auf der Fressplatte abgelegt. Da aber nix gespeichert wird, bevor ich es nicht manuell mache, nehme ich an, die Daten befinden sich im Arbeitsspeicher.

@wulfskin.....
zuerst habe ich versucht, die Daten aus der Listbox mit
ausblenden Delphi-Quelltext
1:
2:
for i:= 0 to Ende do
series1.addY(strtofloat(irgendwas[blub]));

einzufügen..... Dabei musste ich noch länger warten ("gefühlte" Ewigkeit).
Also wollte ich über TDBChart die Daten direkt aus einer Tabelle greifen, was zu dem o.g. "Erfolg" geführt hat. (Dauer: "gefühlte" halbe Ewigkeit).
Das mit dem Ongetdata kenn ich noch nicht , ich denke aber , dass das nix für mich ist (Ich möchte ja erst nach Abschluss der Messung die Daten darstellen-> Notwendigkeit die Daten irgendwo abzulegen).
Das mit dem "in einem Ruck zu übertragen" hört sich interessant an, habe aber diesbezüglich noch nix gefunden...

Wie gesagt...ich bin noch recht frisch in der Prorgammierung und daher für jeden Vorschlag offen und dankbar.
Besten Dank schon einmal bis hier.

//----------------------------------------
und wenn du glaubst es geht nicht mehr,
kommt von irgendwo ein Lichtlein her....

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Di 12.09.06 15:17 
ich habe vor langer langer zeit ein paar sachen mit TChart gemacht... das geht da eigentlich ziemlich schnell... wichtig ist nur, dass du vor dem einfügen vieler einträge beginupdate und anschließend auch endupdate aufrufst... ob dass nu methoden von TChart oder TSeries sind, weiss ich aber nicht auswendig

die listbox hat auch ein beginupdate/endupdate... macht es auch da was schneller...

für dein dataset... ich bin mir auch da nicht hundertprozentig sicher, aber schau mal, ob du das nicht in einem "rutsch" machen kannst... also das post erst nach den ganzen appends... oder später applyupdates oder irgenwas in der richtung... so müsstest du recht viel zeit einsparen können

ich meine, du kannst TChart bzw. TSeries auch einen Array als neue Werte- Reihe übergeben... dann geht es noch schneller...

Viele neue Ideen, eine davon wird schon hinhauen:

Viel Erfolg

C.
edelfred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Di 12.09.06 15:40 
@crowley....
tatsächich scheit es ein Problem des TCharts zu sein, das die Konvertierung von Wert in die Liste und von Liste in die Tabelle recht flott geht.
Es fängt dann an zu haken, sobald man die TDBChart Komponente mit der Tabelle verknüpft, dann wirds laaaaaaaaaaangsam!

Also müsste die Frage vielmehr lauten....wie kann ich dem TDBChart (oder Tchart) alles in einem Rutsch übergeben??











//------------------------------------------------------
Im Schildkrötentempo nach vorne!!
lff
Hält's aus hier
Beiträge: 12

Win XP/Vista
Delphi 2007/2009
BeitragVerfasst: Di 12.09.06 15:51 
Hallo,
Du mußt vor deiner dataset Schleife "clientdataset1.disablecontrols" und dahinter "clientdataset1.enabledcontrols" einfügen. Dann wird es sicher viel schneller.

Gruss
lff
edelfred Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Di 12.09.06 16:14 
@[/quote]lfff......


du bist mein persönlicher Held.........
besten Dank, da du meinen Knoten zum platzen gebracht hast.....

Die Lösung kann manchmal so einfach sein, die Lösungsversuche so kompliziert....;)
besten Dank und dir nen schönen Abend (den anderen latürnich auch )