2013-05-21 4 views
0

해독 됨 : 코드가 이벤트를 통해 10ms마다 실행되고 이벤트를 해결하는 데 걸리는 시간이 늘어납니다.C# 문이 사용되는 경우 거짓

나는 우연히 발생하지 않아야 할 이상한 IndexOutOfRangeException을 경험하고 있습니다. 문 자체가 '거짓'인데도 if 문 안의 코드가 사용됩니다. 이것은 알려진 문제입니까? 그렇다면 어떻게 해결할 수 있습니까?

카운터 (int)가 0 일 때 오류가 발생하여 array 램프에서 element -1을 요청합니다.

코드 :

if (counter > 0) 
    { 
    Console.WriteLine("counter-1 is groter dan 0"); 
    int i = counter - 1; 
    Lights[i].setState(0); 
    } 
+0

다른 스레드에서 '카운터'에 액세스합니까? –

+0

죄송하지만, 그건 옳지 않습니다.if 문이 false이면 다중 스레드 문제가없는 한 문 안의 코드는 실행되지 않습니다. 우리가하는 일을 볼 수 있도록 더 많은 코드를 게시 할 수 있습니까? –

+0

오류의 이미지는 여기에서 볼 수 있습니다 : http://s13.postimg.org/a0frmariv/indexoutofrange.jpg 나는 또한 매우 놀랐습니다 .. 응용 프로그램은 단일 스레드 응용 프로그램이고 카운터는 개인 변수입니다 . – Simon

답변

0

처럼하려고합니다. 이의있는 posibility을 만들어 :

  • 이벤트 A. 동안 경우 문 내부에 점점이 프로그램
  • 새로운 이벤트 B가 해고 및 이벤트 B. 돌보는 CPU는
  • 이벤트 B는 카운터 변경 음수 값으로 설정하여 if 문을 거짓으로 만듭니다.
  • 이벤트 처리를 위해 CPU가 변경됩니다.
  • if 문 자체가 false 임에도 불구하고 프로그램이 이제 if 문 내부에 있습니다.

이벤트가 자주 발생하지 않아 문제가 해결되었습니다.

+0

문제는 해결되지 않았다. 단지 일어날 가능성이있다. –

+0

뮤텍스를 사용하여 문을 잠그는 것은 옵션 일 수 있었지만 필요했을 것이다. 내가 문제를 일으킬 수있는 모든 진술을 잠그는 것. 이 프로그램은 특정 하드웨어에서 실행되도록 설계되었으므로 제한 사항은 알려졌으며 프로젝트 기간 동안 변경되지 않습니다. – Simon

1

카운터에 액세스하지 않는 한/멀티 스레드 방식으로 조작 -이 불가능한 상태이어야한다.

당신은 항상 한 곳에서 할당 & 확인을 시도 할 수 있습니다 :

var index = 0; 

if ((index = (counter - 1)) > 0) 
{ 
    Lights[index].setState(0); 
} 
+0

이것은 코드를 읽기 어렵게 만들고 imho를 디버그하기가 더 어렵습니다. 스레드 안전성을 위해 아무 작업도 수행하지 않습니다. – Steve

0

배경에 counter을 변경하는 다른 스레드가없는 경우, 유일하게 가능한 설명은 Lights[] 컬렉션의 크기가 0이다.

해당 요소에 액세스하기 전에 Lights의 길이를 확인해보십시오.

+0

그러나 그게 거짓으로 평가하는 조건에도 불구하고 실행되는 코드를 설명합니다 – tariq

+0

@ tariq 나는 그것이 일어나고 있다고 생각하지 않습니다. 실제로 일어나는 것은'Lights []'는 크기가 0입니다. 그러나 링크 된 이미지의 메시지가 매우 이상하게 보입니다. 디버거가 확실히 카운터를 0으로 표시하고 있습니다. 이상한 빌드 문제가 실제 원인을 가려 낼 수 있다고 생각합니다. –

+0

@MatthewWatson : if 문을 입력하기 전에 1 이었기 때문에 툴팁에 카운터가 0으로 표시되었다고 생각합니다. 감소했다면 현재 줄이 감소합니다. 다른 툴팁 imho는 마우스 오버시 평가되므로 그 시점에서'counter> 0'는'false'입니다 – Gorgsenegger

1

counter이라는 다른 코드가 변경되지 않은 단일 스레드 응용 프로그램 인 경우 대부분 Lights은 길지 않습니다. 그리고 Lights는 길이 제로의 배열, 다음 Lights[i] (Lights[0])이이 예외를 일으킬 것입니다 - 예를 들어, counter 경우 (그래서 if 테스트는 통과 할 것이다이다, 난 당신이 동의 할 거라고 생각 > 0) - 1 경우, 또는 counter200하지만 Lights.Length199 (이하) 인 - 198-Lights[i] (Lights[199])가 0 범위의 밖에있다.

체크 Lights.Length.

+0

예, 그게 제가 생각한 것입니다! 그러나 op 게시자가 디버거에서 표시 한 오류 메시지를 보면 매우 확신 할 수 없었습니다! (나는 어떤 이유로 여기에 링크를 재 게시 할 수 없다 ...) –

0

는 타이머 이벤트를 10ms마다 해고이

int i=0; 
if (counter > 0) 
{ 
Console.WriteLine("counter-1 is groter dan 0"); 
i = counter - 1; 
Lights[i].setState(0); 
}