Qt 모듈의 스레드 지원

스레드와 SQL 모듈

데이터베이스 연결은 연결을 생성한 스레드 내에서만 사용해야 합니다. 연결을 다른 스레드로 이동하는 것은 QSqlDatabase::moveToThread()를 사용하여 수행할 수 있습니다.

또한 QSqlDriver에서 사용하는 타사 라이브러리는 멀티스레드 프로그램에서 SQL 모듈을 사용하는 데 추가적인 제한을 가할 수 있습니다. 자세한 내용은 데이터베이스 클라이언트의 설명서를 참조하세요.

스레드에서 페인팅

QPainter 를 스레드에서 사용하여 QImage, QPrinter, QPicture, 그리고 (대부분의 플랫폼에서) QPixmap 페인트 장치에 페인팅할 수 있습니다. Q위젯에 그리기는 지원되지 않습니다. macOS에서는 GUI 스레드 외부에서 인쇄하는 경우 자동 진행률 대화 상자가 표시되지 않습니다.

주어진 시간에 원하는 수의 스레드에서 페인팅할 수 있지만, 한 번에 하나의 스레드만 주어진 페인트 장치에 페인팅할 수 있습니다. 즉, 두 개의 스레드가 각각 별도의 QImage에 페인트할 경우 동시에 페인트할 수 있지만 두 스레드가 동시에 동일한 QImage 에 페인트할 수는 없습니다.

스레드 및 서식 있는 텍스트 처리

QTextDocument, QTextCursor모든 관련 클래스는 재진입합니다.

GUI 스레드에서 생성된 QTextDocument 인스턴스에는 QPixmap 이미지 리소스가 포함될 수 있습니다. QTextDocument::clone ()를 사용하여 문서의 복사본을 만들고 인쇄 등의 추가 처리를 위해 복사본을 다른 스레드로 전달합니다.

스레드와 SVG 모듈

QtSvg 모듈의 QSvgGeneratorQSvgRenderer 클래스는 재진입합니다.

스레드와 암시적으로 공유되는 클래스

Qt는 많은 값 클래스, 특히 QImageQString 에 대해 암시적 공유라는 최적화를 사용합니다. Qt 4부터 암시적 공유 클래스는 다른 값 클래스와 마찬가지로 스레드 간에 안전하게 복사할 수 있습니다. 완전히 재진입할 수 있습니다. 암시적 공유는 정말 암시적입니다.

많은 사람들이 암시적 공유와 멀티스레딩을 양립할 수 없는 개념으로 생각하는 이유는 일반적으로 참조 계수가 수행되는 방식 때문입니다. 그러나 Qt는 원자 참조 계수를 사용하여 공유 데이터의 무결성을 보장하고 참조 카운터의 잠재적 손상을 방지합니다.

원자 참조 계수는 스레드 안전을 보장하지 않는다는 점에 유의하세요. 스레드 간에 암시적으로 공유되는 클래스의 인스턴스를 공유할 때는 적절한 잠금을 사용해야 합니다. 이는 공유 여부와 관계없이 모든 재진입 클래스에 적용되는 동일한 요구 사항입니다. 그러나 원자 참조 카운팅은 암시적으로 공유된 클래스의 자체 로컬 인스턴스에서 작업하는 스레드가 안전하다는 것을 보장합니다. 명시적인 잠금 없이도 스레드 간에 데이터를 전달할 수 있으므로 시그널과 슬롯을 사용하는 것이 좋습니다.

요약하자면, Qt 4에서 암시적으로 공유되는 클래스는 정말 암시적으로 공유됩니다. 멀티스레드 애플리케이션에서도 일반 비공유 재진입 값 기반 클래스처럼 안전하게 사용할 수 있습니다.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.