2013-08-05 3 views
1

저는 현재 C++ 및 Qt 프레임 워크로 작은 응용 프로그램을 작성하려고합니다. 백그라운드 작업을 사용해야합니다. 작업자 코드의 마지막 개정판입니다.Qt 프레임 워크에서 작업자 생성을 올바르게 수정하십시오.

class Worker : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Worker(QObject *parent = 0); 

    static void submitNewWorker() { 
     QThread *thread = new QThread; 
     Worker *worker = new Worker; 
     worker->moveToThread(thread); 
     connect(thread, SIGNAL(started()), worker, SLOT(do_work())); 
     connect(worker, SIGNAL(work_done()), worker, SLOT(deleteLater())); 
     connect(worker, SIGNAL(work_done()), thread, SLOT(quit())); 
     connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
     thread->start(); 
    } 

signals: 
    void work_done(); 

public slots: 
    void do_work() 
    { 
     // do a lot of stuff 
     emit work_done(); 
    } 
}; 

현재 작업자가 올바르게 구현되어 있습니까? 가능한 메모리 누수가 있습니까 (new Workerstd::bad_alloc을 호출하면 QThread 개체가 누출 될 수 있음) 또는 스레드 버그가 있습니까?

답변

1

예, 구현이 올바르게 보이고 스레드와 작업자가 완료되면 스스로 삭제하기 때문에 메모리 관리를 올바르게 처리하는 것처럼 보입니다.

특히 스레드 생성이 비싸기 때문에 많은 작업자를 생성하는 경우에만 성능에 대한 우려가 있습니다. 스레드 풀 사용에 대해 생각해 보셨습니까? 좀 봐봐 http://qt-project.org/doc/qt-5.0/qtcore/qthreadpool.html

+0

데이터를 처리하고 종료 (화재 및 잊어 버리기)해야하는 작업자 클래스의 경우, QRunnable을 서브 클래 싱 한 다음 QThreadPool에 전달하는 것이 일반적입니다. 이 방법을 사용하면 오버 헤드가 적어 (연결이 필요하지 않음) Qt가 모든 스레딩 항목을 처리합니다. 문제 해결에 대해서만 걱정하면됩니다. – RobbieE

관련 문제