2011-12-26 6 views
-1

문제C# 글로벌 변수

안녕 모두, 나는 C#에서 피아노를 개발하고있다. 피아노를 만드는 데 성공했으며 잘 연주합니다. 그러나 두 개의 타이머를 사용하고 싶습니다.

얼마나 많은 시간 동안 왼쪽 마우스 단추를 누른 상태 (Form.cs)를 유지하고 다른 시간에 따라 음악을 재생할 다른 타이머 왼쪽 마우스 버튼은 계속 누르고있었습니다 (이 타이머는 MusicNote.cs에서 찾을 수 있습니다).

첫 번째 타이머는 정상적으로 작동하며 모든 눈금마다 지속 시간이 길어집니다. 문제는 전역 변수 의 지속 시간을으로 Form1에서 MusicNote.PlayMusic로 전달하려고 시도하면 duration 값이 0이되고 textBox2.Text에 올바르게 표시된 값이 아니라는 것입니다.

bNoteShape를 Form1에서 MusicNote로 전달할 때도 동일한 문제가 발생합니다.

편집 여러분 모두 감사합니다. 문제를 해결했습니다.

+1

왜 타이머를 사용하여 경과 시간을 계산합니까? – Oded

+1

너무 많은 코드입니다. 문제와 관련된 부분까지 잘려야합니다. –

+0

이것은 매우 이상합니다. mn.PlayMusic (pit, duration)에 중단 점을 넣으려고 했습니까? 그걸 디버깅하는거야? dur가 0이되는 지점을 찾으십시오. – Svarog

답변

5

나는이 답변을 더 일찍 게시했고, 2 개의 upvotes를 받았지만 마음을 바꿨다. 삭제하고 더 많은 문제를 해결 했으므로 이제 다시 게시하고있다.

우선, duration은 글로벌 변수가 아닙니다. 그것은 당신의 반원입니다.

이제 duration이 (가) PlayMusic() (으)로 전달되면 0 인 이유를 알 수 없습니다. 나는 그것을 열심히 들여다 보았고 그러한 일이 일어날 이유가없는 것으로 보인다. Click() 그렇게 duration 그 시간에서 0이 아닐한다 MouseUp()와 함께 발생합니다 나는 panel1_MouseDown() 제로 세트를, 즉시 나중에는 panel1_Click()PlayMusic()에 전달하지만 정확하지 않은 생각했다.

어쨌든 그것을 변경해야 할 것, 그리고 문제가 아마도 그 과정에서 자체 해결됩니다 귀하의 접근 방식은 완전히 잘못 때문에 그러나 그것은 중요하지 않습니다.

당신이 MouseDown() 즉시 PlayMusic()를 호출해야하기 때문에 당신은 피치와 지속 시간 PlayMusic()를 호출 할 수 없을 것이다, 그러나 그 시간에 당신은 기간이 아직 될 것입니다 모르겠어요.

또한 타이머를 사용하여 기간을 계산하는 것은 완전히 불필요하며 본질적으로 부정확합니다. 기간을 정확히 알고 싶으면 MouseDown()에 현재 시간을 기록하고 현재 시간에서 MouseUp()을 뺍니다. 하지만 그렇게 할 필요는 없습니다. MouseUp()에서 사운드 재생을 중지하기 만하면됩니다. 나중에 소리를 재생할 수 있도록하기 위해 수행해야합니다.

또한 새 MouseDown 및 MouseUp 이벤트 처리기를 사운드 카드에 추가하는 것이 올바른지 다시 한번 생각해보십시오. 패널에서 OnClick 이벤트를 수신 할 때마다

또한 특히 다른 사람에게 코드를 보여줄 때 특히 그 코드의 잘못된 점을 파악하도록 요청할 때 의미있는 변수 이름을 사용하는 것이 좋습니다.panel1_OnClick 핸들러는 이름에서 알 수 있듯이 panel1의 클릭 이벤트를 처리하지 않지만 대신 모든 음악 키 버튼의 클릭 이벤트를 처리합니다.