c++ qthread 예제

By | August 2, 2019

실제적인 예: 전용 스레드에서 작동 하는 TcpConnection 연결 클래스를 살펴보겠습니다.이 클래스는 스레드 안전 메서드를 내보내려면: bool isConnected(). 내부적으로 클래스는 소켓 이벤트를 수신 대기합니다: 내부 부울 플래그를 유지하기 위해 연결 및 연결이 끊어졌습니다: https://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html 그러나 Qt는 표준 라이브러리 형식을 노출한 적이 없습니다. 공용 ABI: 표준 라이브러리 형식을 수행하거나 반환하는 모든 함수는 인라인이어야 했습니다(예). 이렇게 하는 주된 이유는 다른 표준 라이브러리 구현(예: libc+++ 및 stdlibc++) 또는 동일한 구현의 두 개의 ABI 호환되지 않는 빌드와 동일한 표준 라이브러리 구현에서 동일한 Qt 빌드를 호환하도록 하는 것이었습니다. Qt 사양이 스레드 선호도에 대해 말하는 내용 : 타이머는 한 스레드에서 시작되고 다른 스레드에서 중지 할 수 없습니다. 소켓 인스턴스를 소유하는 스레드만 이 소켓을 사용할 수 있습니다. 즉, 스레드를 시작한 스레드에서 실행 중인 타이머를 중지해야 하며 소켓을 소유하는 스레드에서 QTcpSocket:close()를 호출해야 합니다. 두 예제 모두 일반적으로 소멸자에서 실행됩니다. Qt::자동 연결을 사용하는 경우 신호가 효과적으로 방출될 때만 최종 연결 유형이 해결됩니다.

이 예제를 다시 보면 첫 번째 connect(): 이 예제에서는 QTimer와 Worker 모두 하위 스레드로 이동됩니다. 실제로 QTimer를 하위 스레드로 이동할 필요는 없습니다. 이 템플릿을 사용하여 이전 예제에서 LogService를 재정의합니다. 그런 다음 삭제를 위해 동일한 완료된() 신호를 사용하여 작업자 인스턴스를 표시합니다. 마지막으로 스레드가 삭제될 때 스레드가 아직 완전히 종료되지 않았기 때문에 불쾌한 충돌을 방지하기 위해 스레드의 완료된(작업자가 아님!)을 자체 deleteLater() 슬롯에 연결합니다. 이렇게 하면 스레드가 완전히 종료된 후에만 스레드가 삭제됩니다. 이 예제에서 QThread를 사용할 때 염두에 두어야 할 중요한 점은 스레드가 아니라는 것입니다. 스레드 개체 주위의 래퍼입니다. 이 래퍼는 Qt 프로젝트 내에서 스레드 개체를 쉽게 사용할 수 있는 신호, 슬롯 및 메서드를 제공합니다.

이를 사용하려면 원하는 모든 기능을 갖춘 QObject 하위 클래스를 준비합니다. 그런 다음 새 QThread 인스턴스를 만들고 QObject 인스턴스의 moveToThread(QThread*)를 사용하여 QObject를 푸시하고 QThread 인스턴스에서 start()를 호출합니다. 그게 전부에요. 제대로 종료 하 고 같은 있도록 적절 한 신호/슬롯 연결을 설정 하 고 그게 전부입니다. 뮤텍스는 사물함 오브젝트를 만들 때 잠겨 있으며, 사물함이 파괴될 때(예: 범위를 벗어날 때) 잠금이 해제됩니다. 반환 문이 표시되는 모든 조건의 경우입니다. 코드를 더 간단하고 읽기 쉽게 만듭니다. 안녕하세요, 피드백 주셔서 감사합니다. 예, 이것은 몇 가지 고려 사항이 주어졌습니다.

Category: Uncategorized