2011-01-13 4 views
2

현재 장치에 요청을 보내고 응답을 기다리는 코드를 작성하려고합니다. 문제는 응답이 메시지가 완료되었음을 나타내는 종료 문자가 없기 때문에 일정 기간 기다려야한다는 것입니다..NET DateTime 객체가 그다지 정확하지 않습니까?

내가하고 싶은 것은 메시지를 보낸 다음 일정 시간 기다리는 것입니다. 데이터가 도착할 때마다 나는 또 다른 100ms를 기다리면서 기다리는 시간을 늘리고 싶습니다. 따라야 할 데이터가 더 있습니다. 그 기간이 지나도 아무것도 나오지 않으면 메시지가 완료되었다고 가정합니다.

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++ 
} 

같이 sendData 및 RecieveData 함수는 클래스 내에서 다른 스레드에 모두 : 이 내가 생각 해낸 의사 코드입니다. 나는 이것을 C#에서 코딩하고있다. DataTime 객체로 구현하려고 시도했지만 밀리 초의 10/100으로 작업 할 때 매우 정확하지 않은 것 같습니다.

이 기능을 구현하는 가장 좋은 방법은 무엇입니까?

감사 아드리안

+2

단순히 절전 모드로 전화하는 대신 바쁜 대기중인 이유가 있습니까? –

+0

이 답변 (http://stackoverflow.com/questions/4212611/raise-event-in-high-resolution-interval-timer/4213950#4213950)이 관심의 대상 일 수 있습니다. – JYelton

+0

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

답변

0

시도 대신 DateTime.Ticks을 비교. 진드기는 100 나노 세컨드입니다. 시스템 클럭만큼 정확합니다. 물론 두 컴퓨터 간의 차이는 엄청날 수 있습니다 (비교 적으로).

+1

시계의 정확도 *는 부적합합니다. 관련된 것은 * 정밀도 *입니다. 약 1/64 초 정도입니다. –

+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다! Thread.Sleep()을 사용하여이 구현을 시도했지만 몇 가지 새로운 데이터가 들어올 때마다 절전 시간을 늘릴 수 있어야합니다. 나는 잠을 잘 수 있었고, 부울이 좀 더 잠을 자도록 설정되어 있는지 확인했다. – Adrian

+0

피키, 까다 롭고 까다 롭습니다. 하지만 맞아. –

1

DateTime정확하게에서 약 1/64 초입니다.

System.Threading.Thread.Sleep(milliseconds)을 사용하지 않으시겠습니까?

+0

언급했듯이, 나는 이것을 sleep로 구현하려고 시도했지만, 데이터의 크기는 다양 할 것이므로 새로운 데이터가 들어 오면 더 많은 데이터가있을 경우 대기 시간을 늘리고 싶다. – Adrian

+0

데이터가 도착할 때마다 절전 모드를 늘리십시오. 잠자기 시간을 지정할 수 있으며 변수가 될 수 있으며 필요에 따라 해당 변수를 수정할 수 있습니다. – jason

0

잠시 잠자기하려면 Thread.Sleep (10000)을 사용하면 스레드가 원하는 밀리 초 동안 잠자기 상태가됩니다.

0

좋아, 그냥 내 솔루션을 게시 할 것이라고 생각이 질문에 종료합니다 : 간단히 말해서, while 루프가 실행 false로 다시 dataInFlag을 설정하고 어떤 데이터가있는 경우, 잠을 것이다 너무

bool dataInFlag; 

function sendData(data) 
{ 
    Send(); 

    dataInFlag = true; 

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

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

을 잠 들어있는 동안 루프가 종료됩니다. 데이터가 수신되면 dataInFlag가 true로 설정되고 루프가 다시 실행됩니다! while 루프의 첫 번째 실행이 더 오랜 기간 동안 잠자기 상태가되고 각 후속 루프가 더 짧은 기간 동안 휴면 상태가되도록이 코드를 확장했습니다.

모든 답장을 보내 주셔서 다시 한 번 감사드립니다.

관련 문제