의 이미지를 QLabel
에 표시해야하는 프로그램을 작성 중입니다. 이미지는 서버에서 전송됩니다. 첫째, 연결 및 서버로부터 데이터 수신에 대한 책임이있는 스레드가 있습니다. 데이터가 수신되면 소켓 스레드는 updateImage(Imagedata)
슬롯에 연결된 gotNewData(Imagedata)
신호를 보냅니다. updateImage(Imagedata)
슬롯에서 서버에서 얻은 이미지 데이터를 QImage
으로 변환하고 QPixmap
을 만들고 QLabel
으로 설정합니다. 내 문제는, 처리 중에 updateImage(Imagedata)
함수는 소켓이 새 이미지로 다른 패키지를 가져오고로 신호를 반복해서 보냅니다. 소켓 스레드는 이전 신호 호출에 의해 호출 된 함수 updateImage(Imagedata)
이 이미 끝났는지 신경 쓰지 않기 때문에 논리적입니다. 내 질문은 : 거기에 몇 가지 기술, 어떻게 내 소켓 스레드를 QWidget
updateImage(Imagedata)
함수와 동기화 할 수 있습니까?은 서버의 이미지 데이터로 QLabel을 자주 업데이트합니다.
답변
분명히 있습니다. 질문은 이전 이미지가 아직 처리되는 동안 새 이미지가 수신되는 경우에 달성하고자하는 것과 정확히 일치하는 것입니다. 새로운 것을 건너 뛰고 끝까지 처리하고 싶다면 호출자와 호출 창을 파괴하는 객체 전송에 blockSignals를 호출하는 것이 좋습니다.하지만 qt는 수신 신호를 차단하는 것을 허용하지 않는 것처럼 보입니다. 성능에 많은 영향을 미치지 않으며 다른 comunication 네트워킹과 혼동하지 않도록 수정하면 레이블을 포함하는 위젯에 프록시 QObject를 만든 다음 moveToThread()를 사용하여 네트워크 스레드로 이동하고 on으로 blockSignals를 사용합니다 이 객체. 당연히이 물체는 실제 신호가 보내지는 것과 같은 서명의 신호를 필요로합니다. 생성 된 객체는 다른 스레드 선호도를 사용하는 동안 논리적으로 GUI 위젯이 소유하고 있으므로 삭제해야합니다.
또 다른 방법은 객체에 bool 변수 processing
을 만들고 데이터를 처리하는 경우 true로 설정하는 것입니다. false로 다시 설정하기 전에 QCoreApplication::processEvents();
을 호출하면 모든 이벤트가 이벤트 대기열에서 처리됩니다. 귀하의 슬롯에 processing
vaiable이 설정되어 있는지 확인하고 무엇이든하는 경우 건너 뛰십시오. 그것은 단순하고 거친 soultion이지만 작동합니다. GUI 스레드에서 processEvents();
(예 : 그와 같은 레이블이 두 개 이상) 다른 이벤트 처리기를 사용하는 경우 일부 레이블이 데이터를 가져 오는 것을 멈출 수 있습니다 (고정).
Qt::BlockingQueuedConnection
을 사용하면 네트워킹 스레드가 처리하기 전에 아무것도 수신하지 못하도록 막을 수 있지만 여러 가지 이유로 그다지 나쁜 아이디어는 아닙니다. (그런 경우 동기화하면 왜 전혀 별도의 스레드가 필요합니까?)
- 1. 많은 레코드를 자주 업데이트합니다.
- 2. 톰캣 응용 프로그램을 자주 업데이트합니다.
- 3. 서버의 데이터로 ListView 채우기
- 4. MySQL 사용자가 행을 기존 데이터로 업데이트합니다.
- 5. QLabel을 스크롤하는 방법은 무엇입니까?
- 6. 은 숫자가 같더라도 SpinnerNumberModel을 업데이트합니다.
- 7. 안드로이드에서 자주 변경되는 데이터로 ListView 업데이트하기
- 8. 이미지 모델을 데이터로 매핑
- 9. 은 C#의 두 목록을 비교하고 업데이트합니다.
- 10. 은 DOJO의 막대 차트로 데이터를 동적으로 업데이트합니다.
- 11. 다른 서버의 이미지 저장
- 12. 원격 서버의 이미지 작업
- 13. 서버로 이진 데이터로 이미지 보내기
- 14. 이미지 데이터로 BRAM을 시작하는 방법
- 15. Java에서 원시 데이터로 이미지 생성하기
- 16. 은 .wav에서 신호를 처리하여 이진 데이터로 변환합니다.
- 17. Amazon은 얼마나 자주 제품 이미지 URL을 업데이트합니까?
- 18. Ruby - 다른 서버의 이미지 복사
- 19. Android 화면에서 서버의 이미지 표시
- 20. 서버의 메모리 제한 이미지 처리
- 21. 필드를 선택적으로 업데이트합니다.
- 22. Maven 종속성을 자동으로 업데이트합니다.
- 23. 텍스트를 자르더라도 QLabel을 축소 할 수 있습니다.
- 24. doubleclick 이벤트로 QLabel을 만드는 링커 오류
- 25. 응용 프로그램 서버의 "엔터프라이즈 수준 기능"은 무엇입니까?
- 26. 은 바이너리 이미지 matlab에
- 27. 은 파일이 변경 될 때 자동으로 mySQL 항목을 업데이트합니다.
- 28. 서버의 이미지 아이콘에 Thumnail URI 표시
- 29. SQL 서버의 데이터로 Google 차트를 만드는 단계는 무엇입니까?
- 30. 서버의 csv 파일에서 핵심 데이터로 데이터 가져 오기
사용자가 GUI를 사용할 수 있어야하므로 소켓에 소켓을 넣습니다. 내 경우에는 사용자가 버튼을 누르면 일부 명령이 서버로 전송됩니다. 명령을 보내기 위해 다른 소켓 연결을 사용합니다. 그래서 이미지 리시버 소켓을 스레드에 넣고 사용자 상호 작용을 차단해서는 안됩니다. –
필자는 '그런 식으로 동기화한다면 왜 별도의 스레드가 필요할까요?'라는 의미였습니다. 어쨌든 첫 번째 해결 방법은 좋은 아이디어입니다. –