2011-01-13 10 views
2

Ich versuche gerade, Code zu schreiben, der eine Anfrage an ein Gerät senden wird, und dann auf die Antwort zu warten. Das Problem ist, dass die Antwort kein Endezeichen hat, um anzuzeigen, dass die Nachricht vollständig ist, so dass wir nur eine gewisse Zeit warten müssen..NET DateTime-Objekt nicht sehr genau?

Was ich tun möchte, ist die Nachricht senden und warten Sie dann eine gewisse Zeit. Jedes Mal, wenn ein Datenelement ankommt, möchte ich die Wartezeit um weitere 100ms erhöhen, falls weitere Daten folgen. Wenn nach diesem Zeitraum nichts eingeht, wird angenommen, dass die Nachricht vollständig ist. Dies ist der Pseudo-Code kam ich mit:

var waitTime 

Function SendData(data) 
{ 
    send the request here and then block with the next code 

    while (waitTime) 
    { 
      //wait 
    } 
} 

Function RecieveData(data) 
{ 
    Assign new data to a buffer 
    waitTime++ 
} 

Die Senddata und RecieveData Funktionen sind beide auf verschiedenen Threads innerhalb einer Klasse. Ich kodiere das in C#. Ich habe versucht, dies mit einem DataTime-Objekt zu implementieren, aber es scheint nicht sehr genau zu sein, wenn man mit 10/100 Millisekunden arbeitet?

Alle Ratschläge, was wäre der beste Weg, dies zu implementieren, wäre willkommen!

Grüße Adrian

+2

Gibt es einen Grund, warum Sie beschäftigt sind - warten anstatt einfach Sleep zu rufen? –

+0

Diese Antwort (http://stackoverflow.com/questions/4212611/raise-event-in-high-resolution-interval-timer/4213950#4213950) kann von Interesse sein. – JYelton

+0

Siehe: http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx –

Antwort

0

Try DateTime.Ticks statt zu vergleichen. Ein Tick ist 100 Nanosekunden. Es ist so genau wie die Systemuhr. Natürlich kann der Unterschied zwischen zwei Computern (im Vergleich) enorm sein.

+1

Die * Genauigkeit * der Uhr ist irrelevant; Relevant ist die * Präzision *. Es ist genau zu ungefähr 1/64 einer Sekunde. –

+0

Hallo, danke für die schnellen Antworten! Ich habe versucht, dies mit Thread.Sleep() zu implementieren, aber ich muss in der Lage sein, die Ruhezeit jedes Mal zu erhöhen, wenn neue Daten eintreffen, nur für den Fall, dass weitere Daten folgen. Ich denke, ich könnte schlafen und dann prüfen, ob ein Boolescher Wert auf ein bisschen mehr eingestellt ist? – Adrian

+0

Wählerisch, wählerisch, wählerisch. Aber richtig. –

1

DateTime ist genaue bis etwa 1/64 einer Sekunde.

Warum benutzen Sie nicht einfach System.Threading.Thread.Sleep(milliseconds)?

+0

Wie bereits erwähnt, habe ich versucht, dies mit sleep zu implementieren, aber die Größe der Daten variiert. Wenn neue Daten eintreffen, möchten wir die Wartezeit erhöhen, falls weitere Daten folgen. – Adrian

+0

Also nur die Schlafmenge jedes Mal erhöhen, wenn Daten ankommen. Beachten Sie, dass Sie angeben können, wie lange Sie schlafen möchten. Dies kann eine Variable sein, und Sie können diese Variable nach Bedarf ändern. – jason

0

Wenn Sie für eine Weile schlafen möchten, verwenden Sie einfach Thread.Sleep (10000), dies bewirkt, dass der Thread für die gewünschte Anzahl von Millisekunden inaktiviert wird.

0

Ok, nur um diese Frage zu Ende dachte ich, ich meine Lösung schreiben würde:

bool dataInFlag; 

function sendData(data) 
{ 
    Send(); 

    dataInFlag = true; 

    while(dataInFlag) 
    { 
      dataInFlag = false; 
      Thread.Sleep(400); 
    } 
} 

function recieveData(data) 
{ 
    Parse(); 
    dataInFlag = true; 
} 

Also kurz gesagt, wird die while-Schleife ausführen, stellen Sie den dataInFlag zurück auf false und dann schlafen, wenn keine Daten Wird während des Schlafes empfangen, wird die while-Schleife verlassen. Wenn Daten empfangen werden, wird das dataInFlag auf true zurückgesetzt und die Schleife wird erneut ausgelöst! Ich habe dies erweitert, so dass die erste Ausführung der While-Schleife für einen längeren Zeitraum schläft und jede nachfolgende Schleife für einen kürzeren Zeitraum schläft.

Nochmals vielen Dank für alle Antworten.

Verwandte Themen