2017-12-21 37 views
0

저는 cypress FX2LP를 사용하여 30 메가 바이트 USB 데이터 전송을 원하고 동시에 다이어그램을 그립니다. 이 30 메가 바이트의 전송 속도를 다루는 전략은 읽기 스레드에서 1 메가 바이트 데이터를 읽은 다음 main_thread에 플로팅하는 것입니다. 그러나이 전략은 1 메가 바이트 버퍼가 필요하며 보드에 그러한 메모리가 없습니다.USB 높은 데이터 전송을위한 가장 좋은 방법은 무엇입니까?

다른 해결책이 있습니까?

+1

스택 오버플로에 오신 것을 환영합니다! 질문에 대한보다 나은 응답을 얻을 수 있도록 [How Minimal, Complete, Verifiable] (http://stackoverflow.com/help/mcve) 예제를 작성하는 방법을 확인하십시오. –

답변

0

이 경우 스레드가 필요하지 않습니다. 간단한 단계로 문제 아래

브레이크 :

  1. 어떻게 측정하고 원하는 데이터를 수집합니까?
  2. 어떻게 데이터를 플롯합니까?

1 단계의 경우 실제 전송 내용이 필요하지 않습니까? 타이밍 만 있으면됩니다. 기본적으로 더미 데이터를 전송하려면 /dev/null에 넣으십시오. 그러나 많은 메모리를 먹지는 않을 것입니다. (nbytes_transferred, timestamp)의 목록을 저장하십시오. 저장, 테스트/검증, 다음

스레드 중 하나 매끄러운 UI 위해 절대적으로 필요하지 않은 2 단계


편집 구현을 진행합니다.
차단/동기 IO를 피하기 위해 만 수행하면됩니다.; 비동기/비 차단 방법을 사용하십시오.
Java에서는 NIO와 같은 의미입니다. Qt에서 - QtConcurrentQFuture을 사용할 수 있습니다.

은 사실상 event loop 모델을 기반으로 모든 GUI 툴킷 작품 :, 또 다시 같은 사용자의 키 누름 또는 마우스 사용으로 이벤트 (의 OS를 쿼리 (일반적으로 application.run() 전화 안에 숨겨져)는 메인 루프 롤있다 [비동기] 네트워크 또는 디스크 IO 완료 또는 진행 중일 때) 핸들 또는 이벤트를 처리하고 결국 onButton1Click 메서드를 호출하고 처리 할 이벤트가 더있을 때까지 잠자기 상태가됩니다.

"이벤트"를 onIdle에 연결하는 방법은 일반적으로 메인 루프가 비활성 상태 (CPU 전력 & 에너지를 절약하기 위해)로 잠들기 직전에 발생합니다. Qt에서 이것은 0 타임 아웃 QTimer이거나 QAbstractEventDispatcher::aboutToBlock() 콜백입니다. 자세한 내용은 this question을 참조하십시오.

이 모든 것이 너무 복잡하면 아마도 this libraryGitHub에서 친절하게 좋은 회사를 확인해보십시오. (나는 단지 Google 순간에 그것을 발견했다, 어떤 제휴도). 출처에서 보면 libusb-1.0에 대한 Qt-onic 개의 API를 제공하는 것처럼 보입니다. 크로스 플랫폼 USB 액세스에 가장 많이 사용됩니다. 오, 그들은 0- 타임 아웃 QTimer 접근 방식을 선택했습니다.

+0

ulidtko 감사합니다, 나를 위해 스레딩의 이점은 사용자 상호 작용입니다.사용자는 전송 및 기타 상호 작용을 중지 할 수 있어야합니다. 또한 나는 내 일을위한 타이머를 가지고있다. 내 현재 전략의 타이머는 매 1/30 초마다 작동합니다. – javad

+0

안녕하세요, @javad, 제 편집 참조! – ulidtko