꽤 오랫동안 하위 클래스에서 가상 실행 메서드를 하위 클래스로 분류하고 구현하여 QThread를 사용했습니다. 이 솔루션을 사용하면 worker 하위 클래스의 실행 메서드는 일반적으로 작업자의 주요 메서드(예제에서 “프로세스”라고 함)입니다. 인스턴스화 컨텍스트에서 다른 QThread 선호도(QObject::moveToThread)로 QObject를 푸시하는 대안은 대부분의 경우 적절한 솔루션에도 제한이 있습니다. 예를 들어 응용 프로그램이 QCoreApplication(또는 QApplication 하위 클래스)을 사용하지 않는 경우를 예로 들 수 있습니다. 다음 예제에서 멤버 변수 m_stop은 stop() 및 run()에 의해 모두 액세스됩니다. 후자는 작업자 스레드, 뮤텍스 또는 기타 시설에서 실행되는 동안 전자가 주 스레드에서 실행된다는 것을 고려하십시오. 이것은 어떤 사람들이 `deleteLater`이벤트의 대기열에 대해 더 우려했던 것과 관련이있을 수 있습니다. Qt 4.8.3에서이 메서드를 사용하려고하지만이 예제에서 제시 된 코드는 QThread의 이벤트 루프가 `deleteLater`이벤트를 사용하기 위해 주어지는 즉시 액세스 위반으로 이어집니다. 지금 의 작업, 나는 내가 생각하는 개인에 있어야했다. 위에서 언급 한 바와 같이 🙂 예제를 주셔서 감사합니다, 개발자는 다른 스레드에서 개체의 메소드를 호출 할 때 항상주의해야합니다.

스레드 선호도는 이 상황을 변경하지 않습니다. Qt 설명서는 여러 메서드를 스레드 안전으로 표시합니다. postEvent()는 주목할 만한 예입니다. 스레드 안전 메서드는 다른 스레드에서 동시에 호출될 수 있습니다. 코드를 별도의 스레드에서 실행하도록 하는 또 다른 방법은 QThread를 하위 클래스화하고 run()을 다시 구현하는 것입니다. 예를 들어, 작업자 스레드에서 주기적으로 작업을 수행하려면 어떻게 해야 합니까? 우아함을 제쳐두고, 공식 문서에서 수행 처럼 하위 클래스 칭 Qthread의 단점은 무엇입니까 (예를 들어 충돌? 메모리 관리? 끔찍한 부끄러운 종료?) 난 그냥 Qt를 배우고 내 경험이 방법이 작동하는 한. 멋진 설명과 예를 주셔서 감사합니다. 아직도 6 년 이상 후에 그것을 발견했습니다! 당신이 그것을 본 적이 있지만 Qt 문서는 이제이 방법을 통합하는 경우 나도 몰라! 멀티 코어 시스템에서 별도의 코어에 각 스레드를 할당 할 수 있습니까? 가능하다면 예제로이 작업을 수행하는 방법을 설명하십시오.

우리가 OS에 의해 할당 된 코어를 명시적으로 오븐 자동 할당하면 효율성이 얻을 수 있습니까? 하나의 스레드가 뮤텍스의 잠금을 해제하지 않으면 어떻게 됩니까? 결과는 고정 된 응용 프로그램이 될 수 있습니다. 위의 예에서는 예외가 throw될 수 있으며 mutex.unlock()에 도달하지 않습니다. 이와 같은 문제를 방지하기 위해 QMutexLocker를 사용해야 합니다. 이 예제에서 QThread를 사용할 때 염두에 두어야 할 중요한 점은 스레드가 아니라는 것입니다. 스레드 개체 주위의 래퍼입니다. 이 래퍼는 Qt 프로젝트 내에서 스레드 개체를 쉽게 사용할 수 있는 신호, 슬롯 및 메서드를 제공합니다. 이를 사용하려면 원하는 모든 기능을 갖춘 QObject 하위 클래스를 준비합니다. 그런 다음 새 QThread 인스턴스를 만들고 QObject 인스턴스의 moveToThread(QThread*)를 사용하여 QObject를 푸시하고 QThread 인스턴스에서 start()를 호출합니다. 그게 전부에요.

제대로 종료 하 고 같은 있도록 적절 한 신호/슬롯 연결을 설정 하 고 그게 전부입니다. 이 자습서에는 Qt의 스레드 작업 방법에 대한 세 가지 기본 방법에 대한 예제가 제공됩니다. 두 가지 추가 예제에서는 실행 중인 스레드와 통신하는 방법과 QObject를 다른 스레드에 배치하여 주 스레드에 서비스를 제공하는 방법을 보여 준다. 이것은 Qthreads를 사용하는 방법에 대한 훌륭한 설명이며 상속 및 run() 메서드를 사용하여 수년 동안 올바르게 사용하는 방법에 어려움을 겪고 있습니다.