2012-11-29 2 views
2

정말 붙어있어, 조언이나 실제 예가 필요합니다.QMathGL을 사용하여 실시간 데이터를 페인트합니까?

1) 나는 데이터를 빠르게 도착 (부스트 : : 스레드 벡터 생산자 스레드가 ~ 초당 100 개 샘플) 2) 나는 그것이 3 도착하는대로 QMathGL가 내 Qt는이

을 동결 GUI 싶지 않은) 데이터를 페인트 할

QMathGL :: update()를 별도의 스레드로 이동하려고했습니다. Qt는 별도의 스레드에서 QPixmap을 사용할 수 없다고 주장합니다.

QMathGL을 수정하지 않고 무엇을 시도해야합니까?

타이머 (fps?)에서 다시 칠할 때주의해야 할 점이 있지만이 솔루션이 마음에 들지 않습니다. 잘못된 것이라면 알려주세요.

답변

0

가끔 비슷한 문제가 발생합니다.

내가 사용하는 일반적인 해상도는 데이터를 버퍼링하고 타이머에서 다시 칠하는 것입니다. 이것은이 (의사 코드)의 라인을 따라 간다 :이 OnNewData 백그라운드 스레드에서 호출한다고 가정

void Widget::OnNewData(void *dataSample) 
{ 
    this->threadSafebuffer->appendData(dataSample); 
} 
void Widget::OnTimeout() 
{ 
    DataBuffer renderBatch = this->threadSafebuffer->interlockedExchange(); 
    /* Do UI updates according to renderBatch */ 

} 

. OnTimeout은 UI-EventLoop의 QTimer에서 호출됩니다. 경합을 막기 위해 현재 버퍼 포인터와 두 번째 버퍼를 연동 교환합니다. 따라서 무거운 동기화 (예 : 무중단/세마포)가 필요하지 않습니다.

renderBatch를 렌더링하기 위해 수행 할 작업량이 제한 시간보다 작은 경우에만 작동합니다.

2

나는 타이머를 사용할 것을 강력히 권합니다. Repaint 작업은 비용이 많이 들고 실제로 10 초 이상 인쇄 된 벡터를 사용자가 실제로 처리 할 수 ​​없다고 가정합니다. 따라서 최종 사용자에게는 디스플레이가 더 부드럽게 업데이트되고 항목에 대한 항목이 별도로 표시되는 것을 제외하고는 실질적인 혜택을 볼 수 없습니다. 그러나 애니메이션을 사용하면 이러한 효과를 훨씬 쉽게 얻을 수 있습니다.)

모든 데이터가 변경 될 때 다시 칠할 때 설명하는 성가신 동작이 발생합니다. 그 문제를 해결할 가치가없는 것은 (이호)입니다.

+0

두 답변 모두 비슷합니다. 미안하지만 나는 평판이 좋지 않은 사람에게 이미 많은 답변을드립니다.). – Maquefel

관련 문제