올바르게 작동하는 직렬 포트를 통해 데이터를 읽습니다. 다음은 내 짧은스레드 슬립 직렬 포트 데이터 이벤트 처리기를 차단하는 중
public Form1()
{
InitializeComponent();
//Background worker
m_oWorker = new BackgroundWorker();
m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
m_oWorker.WorkerReportsProgress = true;
m_oWorker.WorkerSupportsCancellation = true;
connectComPort.DataReceived += new SerialDataReceivedEventHandler(receiveData);
enableDisable();
}
void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{
backProcess();
m_oWorker.ReportProgress(100);
}
private void backProcess()
{
//do some work
Thread.Sleep(10000);
if(check if 2000 bytes received)
{
//do some work
}
}
backProcess을 코드() 백그라운드 작업자에서 실행하고 나는 시리얼 포트로부터받은 바이트를 삽입하는 글로벌 큐를 가지고 있고 루프 경우에이 큐를 확인합니다.
내 문제는 2000 바이트가 다른 끝에서 PC로 전송 될 때 thread.sleep 문까지 1000 바이트 이하를 수신하지만 thread.sleep 단계에서 중단 점을 설정하면 전체 2000 바이트가 수신된다는 것입니다. 그럼 thread.sleep (백그라운드 스레드) 블록 데이터 수신 이벤트 핸들러도? 이 문제를 어떻게 피할 수 있습니까?
'backProcess'가 백그라운드 작업자'm_oWorker'와 어떤 관련이 있는지 알 수 없습니다. – kennyzx
단순히 디버거 중단을 사용하여 절전 모드를 늘린 것입니다. 드라이버는 디버거 중단이 활성화되어있는 동안 계속 데이터를 수신합니다. 전체 접근 방식에 큰 결함이 있습니다. DataReceived 이벤트 처리기에서받은 바이트 수를 2000 바이트로 처리해야합니다. 스레드가 대기 할 때까지 기다리지 않아도됩니다. –