2010-11-18 3 views
0

첨부 된 이미지와 같이 나타나는 양식이 있습니다. 이 질문에 관련된 두 부분 : TabControl 및 Panel (이미지에 표시된대로)이 있습니다. 패널은 TabControl 안에 있지 않습니다.스레드를 중지하고 UI 이벤트를 처리하도록 허용 한 다음 스레드를 "다시 시작"하시겠습니까?

alt text 내 상황은 패널에서 녹색으로 녹아서 표시된 버튼을 클릭 할 때 지속적으로 실행되는 스레드가 있다는 것입니다. 스레드는 내가 인터페이스하는 장치를 폴링하고 TabControl의 아래쪽에있는 "Status"GroupBox의 컨트롤을 업데이트합니다. 사용자가 TabControl (tabControl_Enter 이벤트)에서 컨트롤을 클릭하면 클릭 한 컨트롤에 필요한 IO를 수행 할 수 있도록 스레드가 반복을 마칠 수있게하는 ManualResetEvent를 트리거합니다. 스레드를 일시 중단하는 코드는 다음과 같습니다 : 나는 현재 수행으로, 버튼을 누를 때 대신, 자동으로 스레드를 다시 시작하면됩니다 싶습니다 무엇

private void StopSynchThread() 
    { 
     synchWaitHandle.Reset(); 
     //various UI changes 
    } 

private void updateSynchStat() 
    { 
     while (true) 
     { 
      synchWaitHandle.WaitOne(); 

      try 
      { 
       updateSynch(); 
      } 
    } 

. 내가 뭘 하려는지 조건부로 각 "bazillion"UI 이벤트 처리기 내에서 StartSynchThread() 호출하여 스레드를 다시 시작하지 않아도됩니다.

private void StartSynchThread() 
    { 
     synchWaitHandle.Set(); 
    } 

이 문제를 처리하기위한 선례 또는 괜찮은 패러다임이 있습니까 : StartSynchThread()는 다음과 같이 정의된다? 그렇게하는 방법에 대한 개념이 없으면 디바이스에서 IO를 수행하는 기능을 디바이스에서 응답을 얻은 후에 이벤트를 생성하는 기능을 변경할 수 있다고 생각하고있었습니다.하지만 이는 비 효과적으로 보입니다.

아이디어가 있으십니까? 당신의 통찰력에 감사드립니다. 감사.

답변

2

간단한 버튼 클릭만으로 실제로 해제 할 수 있다면 주기적으로 올바른 조건을 확인한 후 버튼을 "누르십시오"(자동으로 synchWaitHandle.Set();으로 전화 걸기) 양식에 넣을 수 있습니다. .

+0

완벽하게 간단한 해결책입니다. 정확히 내가 원하는 것. 버튼 누름기를위한 핸들러는 시작/멈춤에 대한 작은 논리를 처리하므로 충분히 쉽게 사용할 수 있습니다. 감사. –

관련 문제