2012-09-05 5 views
1

QT로 신청하고 있습니다. QExtSerialPort를 사용하여 readyread() 신호가 발생할 때마다 comp의 직렬 포트에서 데이터를받습니다. 또한 특정 간격으로 다른 작업을하는 타이머가 있습니다. 이제는 타이머가 켜져있을 때 타이머가 켜져 있지 않을 때 미리 읽힌 신호의 모든 데이터가 훨씬 적게 방출되는 것이 아니라는 사실을 알게되었습니다. QT에서 직렬 포트의 모든 데이터를 수신 할 수있는 방법이 있습니까? 어쩌면 readyread 이벤트 나 그와 비슷한 것에 우선 순위를 설정하는 것일까?이벤트 우선 순위 설정

+1

어떤 전송 속도를 사용하고 있습니까? 속도를 늦출 수 있습니다. – TJD

+1

현재 115200에서 약 500hz에서 데이터를 수집한다고 가정합니다. – Frank

답변

3

신호 슬롯 연결과 이벤트 시스템간에 차이가 있습니다. 신호 방출과 슬롯 트리거링은 별개의 것이 아닙니다. 신호가 방출되면 연결된 슬롯이 작동하기 시작합니다. 그래서 그들은 (신호) 잃어 버릴 수 없습니다.

모든 이벤트는 응용 프로그램을 통해 전송되며 수신되지만 나중에 발생할 수 있습니다. 제어가 기본 이벤트 루프로 돌아 가면 대기열에 저장된 모든 이벤트가 처리됩니다.

직접 이벤트를 게시하는 경우 static void QCoreApplication::postEvent (QObject* receiver, QEvent* event, int priority); 메서드를 사용할 수 있습니다. 이벤트는 우선 순위가 내림차순으로 정렬됩니다. 즉 우선 순위가 높은 이벤트는 우선 순위가 낮은 이벤트보다 먼저 대기합니다. 우선 순위는 INT_MAX와 INT_MIN 사이의 모든 정수 값이 될 수 있습니다. 자세한 내용은 Qt :: EventPriority를 ​​참조하십시오. 우선 순위가 동일한 이벤트는 게시 된 순서대로 처리됩니다.

+0

Qt 프레임 워크가 신호를 이벤트로 변환합니다. 이것은 짝수 신호가 이벤트 큐에 저장되고 작은 지연으로 실행될 수 있음을 의미합니다. – Hokyo

+1

기본값 신호가 수신 객체와 다른 스레드에서 방출되는 경우 신호는 대기열에 올려 져 Qt :: QueuedConnection 및 이벤트로 작동합니다. 그렇지 않으면 Qt :: DirectConnection처럼 동작하는 슬롯이 직접 호출됩니다. 연결 만 신호 대기가 아닌 대기열에 대기시킬 수 있습니다. 그래서 당신은 여기에 거의 틀리지 않습니다. –