2015-02-22 12 views
8

Tôi có một lớp:Qt: qthread bị phá hủy khi chủ đề vẫn chạy trong đóng

class centralDataPool : public QObject 
{ 
    Q_OBJECT 
public: 
    centralDataPool(QObject * parent = 0); 
    ~centralDataPool(); 
    commMonitor commOverWatch; 

private: 
    QThread monitorThread; 
    int totalNum; 

signals: 
    void createMonitor(int); 
}; 

Trong constructor của nó tôi đã làm:

centralDataPool::centralDataPool(QObject* parent) : QObject(parent),totalNum(0) 
{ 
    connect(this, SIGNAL(createMonitor(int)), &commOverWatch, SLOT(createMonitor(int))); 
    commOverWatch.moveToThread(&monitorThread); 
    monitorThread.start(); 
} 

khi tôi gọi destructor của lớp này tôi nhận được thông báo lỗi:

qthread destroyed while thread is still running 

Nhưng khi tôi cố gắng chấm dứt màn hìnhThread in the destructor of class centralDataPool,

centralDataPool::~centralDataPool() 
{ 
    monitorThread.terminate(); 
} 

Tôi bị rò rỉ bộ nhớ.

Cách chính xác để chấm dứt chuỗi trong khi hủy đối tượng chủ sở hữu của nó là gì?

+1

đâu là mã destructor của bạn? –

+0

@ ViníciusGobboA.deOliveira Xem các chỉnh sửa. – Nyaruko

+1

Bạn không nên hoàn thành một chủ đề như thế này. Xem tài liệu: http://doc.qt.io/qt-5/qthread.html#terminate –

Trả lời

12

Bạn nên lưu ý rằng nếu bạn có vòng lặp chạy trong chức năng của chuỗi, bạn nên kết thúc một cách rõ ràng để chấm dứt chuỗi chính xác.

Bạn có thể có biến thành viên trong lớp học có tên finishThread cần được đặt thành true khi ứng dụng sắp đóng. Chỉ cần cung cấp một vị trí mà bạn đặt giá trị cho finishThread. Khi bạn muốn chấm dứt, luồng phát ra tín hiệu được kết nối với khe đó với giá trị true. finishThread phải được cung cấp trong điều kiện vòng lặp để kết thúc khi được đặt thành true. Sau đó chờ đợi cho các sợi để hoàn thành đúng cho một số giây và buộc nó chấm dứt nếu nó không kết thúc.

Vì vậy, bạn có thể có trong destructor của bạn:

emit setThreadFinished(true); //Tell the thread to finish 
monitorThread->quit(); 
if(!monitorThread->wait(3000)) //Wait until it actually has terminated (max. 3 sec) 
{ 
    monitorThread->terminate(); //Thread didn't exit in time, probably deadlocked, terminate it! 
    monitorThread->wait(); //We have to wait again here! 
} 
Các vấn đề liên quan