Hat DateTime oder TimeSpan ein Problem?

17/03/2008 - 11:43 von Rainer Queck | Report spam
Hallo NG,

ich kàmpfe zur Zeit mit einem Problem, dass mich Vermutenlàßt, dass die
Klassen DateTime und/oder TimeSpan ein Problem haben.
Ich weiß, vermutlich ist diese Problem in meinem Code zu suchen, aber
irgenwie bin ich ratlos

Ich habe einen Thread in einer Klasse, dessen Aufgabe es ist die Zeit
für das "Einschwingen" 0->1 und "Ausschwingens" 1->0 zu messen.

Der Code dieser Methode ist unten angefügt.
Laut Diagnos làuft der Vorgang wie erwarte, aber die mit DateTime und
TimeSpan ermittelten
Zeiten sind jenseits von Gut und Böse:

Auszug aus meiner Diagnose:
10:42:07.590-I:EinschwingZustand = WaitingForIstW25
10:42:41.871-I:EinschwingZustand = SearchingTe
10:42:45.215-I:EinschwingZustand = FoundTe

Hieraus ergibt sich ein Te von ca. 3,34 Sekunden (Das ist OK)

10:43:04.199-I:EinschwingZustand = SearchingTa
10:43:08.340-I:EinschwingZustand = Done

Hier ergibt sich ein Ta vn ca. 4,14 Sekunden (auch OK)

im Code wird Te und Ta aber total falsch bestimmt:
10:43:08.340-I:BfpManager.DoEinschwingThread: Te=0; Ta&,46875;
T7,6920971514459;

Nun ist das aber nicht immer so. Der "Fehlerfall" tritt vergleichsweise
Selten auf.
Zu 90% (aus dem hohlen Bauch) Wird die Zeit richtig erfasst.

Woran kann das Liegen?
Kann es sein, dass DateTime und/oder Timespan nicht threadsafe sind?


Über jegliche Hilfe und Hinweise wàre ich sehr froh!

Gruß
Rainer

// Die Threadmethode, welche das Éin- und Ausschwingen mist
private void DoEinschwingThread()
{
FileDiagnose.Instance.ReportInfo("BfpManager. :Entering Einschwing
Thread Method)");
try
{
einschwingState = EinschwingState.WaitingForIstW25;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand =
{0}", einschwingState));
double te = 0;
double ta =0;
double t = 0;
DateTime teTaTimeStamp = DateTime.Now;
while (!EinschwingThreadTerminated)
{
EinschwingEvent.WaitOne(cEinschwingTimeOut, false);
double hubWinkelIst = 0;
double hubWinkelSoll = 0;
switch (BfpNetPrg.settings.PruefstandTyp)
{
case PruefstandTyp.Krfp:
hubWinkelIst = Hub.Instance().ActValue;
hubWinkelSoll = Hub.Instance().SetPoint;
break;
case PruefstandTyp.Stabi:
hubWinkelIst = Winkel.Instance().ActValue;
hubWinkelSoll = Winkel.Instance().SetPoint;
break;
default:
throw new ArgumentException("nicht implementierter
Prüfstand : " + BfpNetPrg.settings.PruefstandTyp.ToString());
}
switch (einschwingState)
{
case EinschwingState.WaitingForIstW25:
if (hubWinkelIst > 0.95 * sollwert25 && hubWinkelIst <
1.05 * sollwert25)
{
einschwingState = EinschwingState.Starting;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand
= {0}", einschwingState));
}
break;
case EinschwingState.Starting:
if (hubWinkelSoll == sollwert50)
{
teTaTimeStamp = DateTime.Now;
einschwingState = EinschwingState.SearchingTe;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand
= {0}", einschwingState));
}
break;
case EinschwingState.SearchingTe:
if (hubWinkelIst >= 0.95 * sollwert50)
{
TimeSpan dt = DateTime.Now - teTaTimeStamp;
te = dt.TotalSeconds;
versuchsreihe.tfTe = te;
teTaRow.esTe = te;
teTaRow.esFrequenz = Frequenz.Instance().ActValue;
teTaRow.esAnregung50 = Anregung.Instance().ActValue;
teTaRow.esHubMax =
Convert.ToDouble(versuchsreihe.vrHubWinkelSollMax);
einschwingState = EinschwingState.FoundTe;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand
= {0}", einschwingState));
}
break;
case EinschwingState.FoundTe:
if (hubWinkelSoll == sollwert25)
{
teTaTimeStamp = DateTime.Now;
einschwingState = EinschwingState.SearchingTa;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand
= {0}", einschwingState));
}
break;
case EinschwingState.SearchingTa:
if (hubWinkelIst < 1.05 * sollwert25)
{
TimeSpan dt = DateTime.Now - teTaTimeStamp;
ta = dt.TotalSeconds;
versuchsreihe.tfTa = ta;
t = te +
(Convert.ToDouble(versuchsreihe.tfBlockSize) / pruefstand.Frequenz.ActValue)
+ ta;
versuchsreihe.tfT = t;
teTaRow.esTa = ta;
einschwingState = EinschwingState.Done;
FileDiagnose.Instance.ReportInfo(String.Format("EinschwingZustand
= {0}", einschwingState));
FileDiagnose.Instance.ReportInfo(String.Format("BfpManager.DoEinschwingThread:
Te={0}; Ta={1}; T={2};", te, ta, t));
EinschwingThreadTerminated = true;
}
break;
case EinschwingState.FoundTa:
case EinschwingState.Done:
default:
EinschwingThreadTerminated = true;
break;
}
}
}
catch( System.Exception ex )
{
FileDiagnose.Instance.ReportError("BfpManager.DoEinschwingThread :"
+ ex.Message);
}
FileDiagnose.Instance.ReportInfo("BfpManager.DoEinschwingThread :
Leaving DoEinschwingThread");
}
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
17/03/2008 - 14:48 | Warnen spam
"Rainer Queck" schrieb:
Kann es sein, dass DateTime und/oder Timespan nicht threadsafe sind?



'DateTime': Alle Mitglieder sind threadsicher. Ausnahme:

| Assigning an instance of this type is not thread safe on all
| hardware platforms because the binary representation of
| that instance might be too large to assign in a single atomic
| operation.

'TimeSpan': Nur statische Mitglieder sind threadsicher.

Beachte, daß 'DateTime.Now' unter NT-basierten Systemen eine Auflösung von
10 ms aufweist. Eventuell wàre es sinnvoller, mit 'Stopwatch' die
Zeitmessung durchzuführen.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen