2017-02-18 1 views
0

나는 내 심장 박동 률 (beat/minute)로 Console.Beep을 생성하기로되어있는 타이머를 가지고있다. 내 C# 타이머에 Timer.Interval을 계산하기 위해 다음과 같은 간단한 공식을 사용하고 있습니다 : 나는 착용에서 내 심장 박동을 읽고있다타이머 간격을 재설정하지 않고 변경할 수 있습니까?

ServerVarValues = new ws ServerVarValues(); 
    this.timerHeartBeatSound = new System.Windows.Forms.Timer(this.components); 

    public class ServerVarValues 
    { 
     public int HR; 
     public DateTime LastHRUpdate; 
     public int SpO2; 
     public DateTime LastO2Update; 
     public double Temperature; 
     public DateTime LastTempUpdate; 
    } 

//... I plug in my heart rate to calculate my new timer interval...  
int tVal = (int)Math.Round((ws.HR/60.0) * 1000,0); 
timerHeartBeatSound.Interval = tVal; 

// and with the new interval, the timer generates a Tick Event that runs this 
    private void PlayHeartBeatSound(object sender, EventArgs e) 
    { 
     Console.Beep(); 
    } 

. 문제는 내 HR이 변경 될 때마다 타이머의 간격을 변경할 때 타이머가 재설정된다는 것입니다. 따라서, 나는 종종 딸꾹질을 부드럽게 변화하는 심박동 소리 대신에 들었다.

심장 박동 수가 바뀔 때마다 타이머를 재설정하는 것을 피하는 방법에 대한 아이디어가 있습니까?

+2

.NET에는 여러 가지 타이머 클래스가 있습니다. 물론 어느 쪽을 사용하든간에 항상 요금 변경을 수용 할 수 있습니다. 어떤 타이머 클래스는 다른 타이머 클래스보다 더 잘 적용됩니다. 컨텍스트에 따라 실제 타이머 대신 루프에서 'Task.Delay()'를 사용하는 것이 더 바람직 할 수 있습니다. 새로운 데이터를 수신 할 때 비동기 적으로 지연 값을 업데이트합니다. 당신이하고 싶은 것을 정확히 보여주는 좋은 [mcve]를 제공하고 문제를 해결하는 데 어려움을 겪고있는 특정 문제를 재현하십시오. –

+0

안녕하세요 피터 - 코드는 실제로 볼 수 있습니다. 저는 비주얼 스튜디오에서 타이머를 설정하고, 타이머 간격을두고 그것을 가능하게합니다. 틱 이벤트에서 Console.Beep을 호출합니다. 내가 싫어하는 것은 타이머를 재설정하기 위해 심박수가 변하기 때문에 시간 간격을 변경할 때마다입니다. 내 생각에 비주얼 스튜디오 타이머가 이상적인 것이 아니라 다른 클래스를 봐야한다는 사실을 암시하는 것 같습니다. – LeoM

+2

_ "코드가 실제로 표시됩니다"_ - 정말요? _anything_을 추가하지 않고 위에서 보여준 프로그램을 컴파일 할 수 있습니까? 'tVal' 또는'timerHeartBeatSound' 변수 나'ws'의 선언이 아니라 코드를 포함하는'class'와 메소드 선언에 신경 쓰지 않으시겠습니까? 앞서 언급 한 [mcve] 기사를 읽으십시오. 그 페이지의 맨 아래에 링크 된 기사를 포함하여 (심지어 특히) [ask]를보십시오. 스택 오버플로에 대한 도움이 필요하면 좋은 질문을 올리는 방법을 배워야합니다. 당신은 지금 당장 그렇게하지 않습니다. –

답변

0

"ASecond"대신 현재 심박수에 해당하는 밀리 초 수를 사용하는 것을 제외하고 다음을 시도하십시오. 이렇게하면 다음 비트까지의 밀리 초 수를 현재 속도에 따라 다시 계산하고 모든 비트에 대해 수행합니다. 나는 그것이 더 매끄럽기를 바란다.

DateTime LastTime = DateTime.Now; 

... 

DateTime NextTime = LastTime + ASecond; 
// Just in case we have gone past the next time (perhaps you put the system to sleep?) 
if (DateTime.Now > NextTime) 
    NextTime = DateTime.Now + ASecond; 
TimeSpan Duration = NextTime - DateTime.Now; 
LastTime = NextTime; 
timer1.Interval = (int)Duration.TotalMilliseconds; 
+0

위의 한스의 대답을 참조하십시오. 그는 그것을 찔렀다! – LeoM

+0

내 것을 시도 했습니까? 아마도 그렇지 않습니다. – user34660

2

예, 이것은 의도적으로 설계된 동작입니다. Interval 속성을 변경하고 동일하지 않으면 타이머가 자동으로 재설정됩니다. 이 동작은 변경할 수 없습니다.

그럼 무엇을해야합니까? 업데이트 간격입니다. 다음 틱이 일어날 때까지는 아닙니다. 어느 것이 좋습니다, 심장 박동이 충분히 빠르게 일어납니다. 당신이 심장 박동 값을 타이머를 시작하거나 업데이트 할 때

public class ServerVarValues { 
    public int NextInterval; 
    // etc... 
} 

그리고 초기화 : 당신은 다른 변수가 필요합니다

... 
int tVal = (int)Math.Round((ws.HR/60.0) * 1000,0); 
if (timerHeartBeatSound.Enabled) ws.NextInterval = tval; 
else { 
    ws.NextInterval = 0; 
    timerHeartBeatSound.Interval = tval; 
} 

그리고 당신은 당신이 있는지 확인하는 데 필요한 틱 이벤트 처리기에서

새 간격을 효과적으로 만들려면

private void PlayHeartBeatSound(object sender, EventArgs e) 
{ 
    if (ws.NextInterval != 0) timerHeartBeatSound.Interval = ws.NextInterval; 
    ws.NextInterval = 0; 
    Console.Beep(); 
} 
+0

당신의 대답은 "상자 밖에서 생각하는"완벽한 사례입니다! 방금 당신의 아이디어를 시도하고 우아하게 작동합니다! – LeoM

+0

@ 한자 Passant, 내 문제는 무엇입니까? 나는 모든 사람의 시간을 낭비했다. – user34660

+1

보통 SO 사용자는 완벽한 솔루션을 선호합니다. 그는 내 대답을 받아들이지 않았기 때문에 너무 많이 읽지 않아야합니다. –

관련 문제