Delphi6&TTimer

Hallo!
Ich habe ein DbGrid(Paradox), das mit einem TTable verbunden ist.In
der nullten Spalte steht eine Zeit(t) in Sekunden und in der ersten
Spalte steht eine Geschwindigkeit(v).Die Zeilenanzahl ist variabel.
Mit der folgenden Procedure kann ich meines Erachtens die Geschwindigkeit
zur passenden Zeit,also Spalte1,Zeile1 zu Spalte0, Zeile1 an den Parallelport
übergeben.

procedure TForm1.Button2Click(Sender: TObject);
var
v, t: single;
max, i: integer;
begin
table1.Open;
table1.first;
i := 0;
max := table1.RecordCount;
for i := 0 to max - 1 do
begin
table1.SetKey;
table1.Fields[0].AsInteger := i;
table1.GotoKey;
v := table1.Fields[1].AsFloat;
t := table1.Fields[0].AsFloat;
databits := Round((B / U) * (U / vmax) * v);
portwriteb($378, databits);
end;
end;

Das Problem besteht nun darin, dass die Bearbeitungsgeschwindigkeit natürlich
abhängig von der CPU ist.
Ich möchte aber nun nur sekundenweise Werte übergeben, also in Sekunde1 den ersten v-Wert,
Sekunde2 den zweiten v-Wert usw.,um die Anwendung auf unterschiedlichen Rechnern laufen lassen
zu können und immer die gleichen Ergebnisse zu bekommen.
Ist vielleicht ganz einfach,aber ich bin leider kein Crack. Hat jemand eine Idee wie`s geht?
Gruß Birk

Das Problem besteht nun darin, dass die
Bearbeitungsgeschwindigkeit natürlich
abhängig von der CPU ist.
Ich möchte aber nun nur sekundenweise Werte übergeben, also in
Sekunde1 den ersten v-Wert,
Sekunde2 den zweiten v-Wert usw.,um die Anwendung auf
unterschiedlichen Rechnern laufen lassen
zu können und immer die gleichen Ergebnisse zu bekommen.

Hallo Birk,

wenn der Kern Deines Problems darin besteht, in bestimmten, festlegbaren Zeitintervallen (z. B. jede Sekunde, jede halbe Sekunde oder alle 5 Sekunden etc.) eine Aktion durchzuführen, dann besteht die einfachste Lösungsmöglichkeit darin, diejenige Komponente zu verwenden, die genau diesen Zweck erfüllt, und das ist „TTimer“ (in die Headline Deines Postings hast Du ja schon „TTimer“ geschrieben). Erläuterungen / Gebrauchshinweise / Tips / Beispielcode zu „TTimer“ findest Du in der Online-Hilfe.

MfG
Martin

Problem mit der Ausführungsgeschwindigkeit…
Um das zu umgehen solltest Du auf jeden Fall erstmal den Inhalt der Datentabelle nicht von Platte auslesen, sondern Dir vor Beginn der Messungen in den Arbeitsspeicher holen - guck Dir mal die Beschreibung über dynamische Arrays in Verbindung mit einem Record an - das wird Dir dieses Problem erstmal lösen.

Die TTimer-Komponente ist zwar ganz nett, aber relativ ungenau - verwende stattdessen eine repeat-until-Schleife, die mit GetTickCount die aktuelle Zeit holt und diese in Relation zur nächsten „Messzeit“ setzt. In der Repeat-Until-Schleife bringst Du nun noch ein Application.ProcessMessages ein, damit Dir nicht der gesamte Rechner einfriert während der Messung.

Wenn Du es ganz genau haben willst, dann führe bei jeder Messung eine extra Messung durch, wie lange der Rechner benötigt um die Daten zu berechnen und senden. Den nächsten Messzeitpunkt passt Du dann entsprechend an.

Nach spätestens der dritten Messung sollten die Werte sehr exakt sein. Wenn Du es von der ersten Messung an so haben möchtest, solltest Du beim Programmstart ein paar „Testmessungen“ durchführen, ohne Daten zu senden und deren Dauer messen.

Anmerkung:
Windows ist als Platform für solche Dinge eigentlich nicht geeignet. Wenn es wirklich genau sein muß, wirst Du um ASM und Interrupts nicht umherkommen. Ich würde Die für diese Aufgabe daher eher Turbo Pascal ab 6.0 empfehlen - dort kannst Du Dich relativ einfach an die Interrupts des Zeitgebers hängen.

Genauer als die TTimer-Komponente ist der Multimedia-Timer (MMTimer). Such mal unter diesem Stichwort (es gibt auch in Komponentensammlungen gute Implementationen dieses Timers, der sich wie die TTimer-Komponente von Borland benutzen lässt). Damit bekommst viel genauere Zeitintervalle hin als mit der unzuverlässigen TTimer-Komponente.

Gruß
Jochen