AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wegmessung in Thread -> v und a berechnen Theoriefrage

Wegmessung in Thread -> v und a berechnen Theoriefrage

Ein Thema von BAMatze · begonnen am 22. Okt 2009 · letzter Beitrag vom 23. Okt 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Wegmessung in Thread -> v und a berechnen Theoriefrage

  Alt 22. Okt 2009, 10:23
Hallo und guten Tag an alle DP´ler,

Mal eine rein theoretische Frage zu der Berechnung von Geschwindigkeit und Beschleunigung eines sich bewegenden Objektes mittels Thread. Wobei eigentlich die Genauigkeit einer solchen Berechnung interessant für mich ist, da ich ja schon oft gelesen hab, dass Windows ja keine "Echtzeit-BS" ist. Die restliche Theorie betreffend Geschwindigkeit ist Ableitung des Weges nach der Zeit, Beschleunigung ist Ableitung der Geschwindigkeit nach der Zeit oder die zweite Ableitung des Weges nach der Zeit, ist mir schon klar.

Also ich verwende folgende Execute-Fkt in meinem Thread:

Delphi-Quellcode:
procedure TControlCardControlThread.Execute;
var c, iIndex: integer;
begin
  for iIndex := 1 to 5 do (Form3.findcomponent('CheckBox' + inttostr(iIndex+8)) as TCheckBox).Checked:= fabDigChannelSignals[iIndex];
  repeat
  c := GetTickCount;
  // hier soll nun eine Wegmessung erfolgen und diese soll mit der vorhergegangenen Messung des Threaddurchlaufes verglichen werden und über das Intervall in Geschwindigkeit und Beschleunigung überführt werden.
  bUpdateDataForm1 := ComportSearch(FsLComport);
  Synchronize(UpdateForms);
  c := {interval}50 - (GetTickCount - c);
  if c > 0 then Sleep(c);
until Terminated;
if assigned(FsLComport) then FsLComport.Free;
end;
Meine Frage ist nun: Ich habe das Intevall des Threads ja auf 50ms festgesetzt. Wie genau werden diese 50ms denn eingehalten? Es ist ja bekannt, dass die Threads immer einen zuteilungsfähigen Status und einen ruhenden Status haben. Wird wirklich nach 50ms die repeat-Schleife des Threads neu gestartet, so dass ich exakt sagen kann, v = ((Differenz der Wegmessung)/ 50ms) oder ist das eher nach dem Motto 50ms +/- Tolleranz (mir ist schon bewusst, dass ein Teil meines Intervalls durch das Abarbeiten meiner Routinen im Thread verbraucht werden)?

Hoffe jemand kann mir da eine genaue Auskunft geben.
Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 22. Okt 2009, 10:50
1. "Form3.findcomponent(" -- Ganz schlecht. Du greifst auf die VCL zu.
2. Die 50ms werden sehr ungenau getroffen. Was hindert dich daran in unbestimmten Zeitintervallen zu fragen und dies über die Uhr o.ä. zu regeln.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 22. Okt 2009, 10:55
Zitat von sirius:
1. "Form3.findcomponent(" -- Ganz schlecht. Du greifst auf die VCL zu.
Ah ok werde ich gleich ändern, bis jetzt hat sich da zwar kein Fehler ergeben, aber ist natürlich besser dies zu ändern.

Zitat von sirius:
2. Die 50ms werden sehr ungenau getroffen. Was hindert dich daran in unbestimmten Zeitintervallen zu fragen und dies über die Uhr o.ä. zu regeln.
Eigentlich hielt mich bis ebend nur ab, das ich selber noch nicht auf die Idee kam, aber hast natürlich Recht, könnte dort ja sehr genau die Zeiten abfragen des Systems, wenn ich in einem Schleifendurchlauf bin und diese dann auch in Realtion zu der vorherigen Messung setzen, was mich dann zu einer relativ genauen Bestimmung von v und a führen sollte (wenn ich dich jetzt richtig verstanden hab).

BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#4

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 22. Okt 2009, 12:41
Generell ist der Aufruf von Synchronize im Thread möglichst zu vermeiden. Da hier eine Synchronisation mit dem Hauptthread erfolgt, ist das Zeitverhalten absolut nicht vorhersehbar und der Vorteil des Threads ist schnell dahin. Das Gleiche könntest du auch mit einem einfachen Timer erreichen.

Wenn im Synchronize lediglich Anzeigewerte aktualisiert werden, ist es besser, diese in einem OnIdle- oder OnTimer-Event zu aktualisieren, wobei eventuell der Zugriff auf die aktuellen Werte threadsicher gestaltet werden muß.Delphi-Referenz durchsuchenTMultiReadExclusiveWriteSynchronizer

Die Zeitdifferenz kann man übrigens sehr gut mit dieser Stoppuhr messen.
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 22. Okt 2009, 13:16
Also der Thread hat in der Synchronize-Anweisung einige Absicherungen (Überwachung von Anschlagssensoren) die die Bewegung absichern sollten. Vieleicht hab ich das am Anfang, wo ich noch Timer verwendet hab ja nicht richtig gemacht, aber erst mit dem Thread ist es mir gelungen, diese Überwachung über die gesamte Zeit sicherzustellen. Bei den Timern kam ab und zu aufgrund der Arbeiten im Hauptthread deutliche Verzögerungen zustande, die ich nicht unter Kontrolle bekommen hab.
2. Account Sero
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#6

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 22. Okt 2009, 17:06
Um de Berechnungen durchführen zu können gehört also zu jedem Wegpunkt auch ein Zeitstempel.
-> Zu jedem Wegpunkt GetTickCount speichern (vorher ein Sleep(0) damit die Anweisungen "Position auslesen" und GetTickCount mgl. unterbrechungsfrei ausgeführt werden, bzw. vorher und nachher GetTickCount auslesen und den Mittelwert zum Wegpunkt zuordnen).
Alternativ z.B. QueryPerformanceCounter, das ist deutlich genauer (nur leider auch langsamer) als GetTickCount.

Dann kann die Berechnung unabhängig von den 50ms "Updateintervall" erfolgen.

Grüsse, Dirk
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Wegmessung in Thread -> v und a berechnen Theoriefrag

  Alt 23. Okt 2009, 08:40
Ah ok werde ich beides mal auprobieren, sowohl die Zeitnahme aus dem System und auch deinen Vorschlag @Dirk.
2. Account Sero
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:56 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