2015-02-06 5 views
0

는 thusly 히 코드의 특정 블록을 입력 한 번에 1 실을 수 있도록 :2 스레드 내가 시도하고

private static object lockObject = new object(); 

protected override void WndProc(ref Message message) { 
    if (id != null) { 
     id.ProcessMessage(message); 

     lock(lockObject) { 
      if (id.ScanCode.Length > 4) { 
       ... 
      } 
     } 
    } 

    base.WndProc(ref message); 
} 

때때로 2 개 스레드가 들어가 모두 코드를 실행하십시오. 나는 이것을 VS 디버거에서 확인했다. 때로는 단 하나의 스레드가 들어간다. 좋지만 적어도 시간의 절반은 2 개의 스레드가 들어간다. 그 내부

나는이 일을하고있어 경우 블록 : 나에게

id.ScanCode = string.Empty; 
return; 

가이 그것을 차단됩니다 한 경우, 입력에서 2 스레드를 방지한다 보인다. 하지만 어쩌면 내가 잘못하고있는 것 같아. 두 번째 스레드가 거기에 들어가는 것을 막는 가장 간단한 방법은 무엇입니까? 동시에 입장 할 수 있었습니까?

+2

나는 어떻게 이런 일이 일어날 지 의심 스럽습니다. 이미 lock()을 사용하여 두 개의 스레드가 lock 문 –

+0

의 코드를 입력 할 수 없었습니다. VS 디버거에서 확인되었습니다. – HerrimanCoder

+0

*'id! = null' 체크를 통과하는 모든 * 쓰레드는 어떤 시점에서 잠긴 코드 블록을 입력 할 것입니다. 그들은 동시에 * 입력하지 않습니다. 일부 스레드 만 입력하려는 경우 일종의 조건부 검사가 필요합니다. –

답변

3

잠금은 스레드가 해당 블록에 들어가는 것을 차단하지 않습니다. 해제 될 때까지 지연됩니다. 한 번에 하나의 스레드 만 해당 코드 블록에 들어갈 것임을 보증합니다. 첫 번째 스레드가 존재하는 즉시 두 번째 스레드는 코드를 잠그고 실행합니다. 등등 ...

코드 블록을 실행하는 데 첫 번째 스레드 만 필요한 경우 먼저 플래그를 설정하고 연속 스레드의 경우 플래그를 먼저 확인하면됩니다.

+0

id.ScanCode 외에 add'l 플래그 (개인 변수)를 사용했는데 해결 된 것으로 보입니다. 모두에게 감사드립니다. – HerrimanCoder

+0

나는 아직도 하나 이상의 스레드가 WndProc을 실행할 수있는 방법에 대해 꽤 궁금해합니다. –

관련 문제