괜찮습니다. 당신은 당신이하고있는 일과 그 이유를 이해해야합니다 : 코드와 그 목적은 당신과 그러한 이해로부터 온 것이어야합니다. 당신이 버튼을 시간을 많이 누르면
이 응용 프로그램은 두 가지 상태 중 하나 일 수 있습니다
스레드는 이미 완료 : obje->thread() == nullptr
는 당신이 스레드를 다시 시작하고 - 그것은 잘 작동합니다 .
스레드가 여전히 실행 중입니다. obje->thread() == thread1
및 moveToThread
과 thread1->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입니다.