2016-08-09 9 views
1

Qthread를 객체와 함께 사용하려고합니다. 이를 위해이 코드는 다음과 같이 작성됩니다.qthread를 삭제하기 위해 삭제자를 사용하지 않으면 어떻게됩니까?

QThread *thread1 = new QThread(); 
serialclass *obje = new serialclass(); 
void MainWindow::on_pushButton_baglan_clicked() 
{ 
    obje->moveToThread(thread1); 
    connect(thread1,SIGNAL(started()),obje,SLOT(baglan()), Qt::UniqueConnection); 
    connect(obje,SIGNAL(finished()),thread1,SLOT(quit())); //end of the baglan function finished() signal is emitted. 
    thread1->start(); 
} 

내 코드가 작동합니다. 하지만 deletelater()가 아닌 quit()을 사용했습니다. 버튼을 많이 누르면됩니다. 첫 번째 질문은이 방법이 사실입니까? 두 번째 질문은 버튼을 많이 누르면 어떤 일이 발생하는지입니다. 실이 많이 있습니까? 하나의 스레드가 생성 될 때마다 있습니까?

답변

0

괜찮습니다. 당신은 당신이하고있는 일과 그 이유를 이해해야합니다 : 코드와 그 목적은 당신과 그러한 이해로부터 온 것이어야합니다. 당신이 버튼을 시간을 많이 누르면

이 응용 프로그램은 두 가지 상태 중 하나 일 수 있습니다

  1. 스레드는 이미 완료 : obje->thread() == nullptr는 당신이 스레드를 다시 시작하고 - 그것은 잘 작동합니다 .

  2. 스레드가 여전히 실행 중입니다. obje->thread() == thread1moveToThreadthread1->start()은 아무 것도 수행하지 않습니다.

아아, 스레드를 중지 할 필요가 없습니다. 새로운 이벤트가 도착할 때까지 차단되는 이벤트 루프가 있습니다. 유휴 상태 인 QThread이 CPU를 모두 사용하고있는 것처럼 아닙니다. 스레드를 시작하는 것은 비용이 많이 들며 새로운 원시 스레드를 만듭니다. 완성 된 스레드가 없어지면 : 예, 여전히 QThread이 있지만 닫힌 파일을 처리하는 것과 같습니다. 결국 QThread은 스레드 핸들입니다.

포인터를 사용하지 말고 멤버를 값으로 유지해야합니다. 이렇게하면 포인트를 통한 여분의 간접 참조가 어리석게 조숙하게 처리되는 것을 피할 수 있습니다. 미리 모든 연결을 설정할 수 있습니다. on_pushButton_baglan_clicked() 슬롯이 필요하지 않습니다. 푸시 버튼을 SerialClass 인스턴스와 직접 연결할 수 있습니다. 안전하게 파괴 할 수있는 QThread 파생 클래스도 사용해야합니다.

코드는 다음과 같습니다. 컴파일러는 적절한 자원 할당 해제 소멸자를 생성합니다. 그것은 컴파일러의 일이며, 그 일에서 당신을 실패하지는 않을 것입니다. 반면에 인간 개발자는 실패하는 경향이 큽니다. 그것은 완벽하게 할 것입니다 기계에 천한 수동 작업을 이동 아무것도 :

// MyWindow.h 
#include <QMainWindow> 
#include <QThread> 
#include "SerialClass.h" 
#include "ui_MyWindow.h" 

class MyWindow : public QMainWindow { 
    Q_OBJECT 
    class SafeThread : public QThread { 
    using QThread::run; // final 
    public: 
    ~SafeThread() { quit(); wait(); } 
    } m_serialThread; 
    SerialClass m_serial; 
    Ui::MyWindow ui; 
public: 
    MyWindow(QWidget * parent = nullptr); 
}; 

// MyWindow.cpp 
#include "MyWindow.h" 

MyWindow::MyWindow(QWidget * parent) : 
    QMainWindow{this} 
{ 
    ui.setupUi(this); 
    connect(ui.pushButton_baglan, &QPushButton::clicked, 
      &m_serial, &SerialClass::baglan); 
    m_serial.moveToThread(&m_serialThread); 
    m_serialThread.start(); 
} 

옆을 위해 당신이 모든 구현 세부 사항을 원하지 않는 경우 따라서 당신이 당신의 최대한 활용에 RAII를 활용한다 MyWindow 님의 헤더에 살고 있습니다. should use a PIMPL입니다.