Tôi đã suy nghĩ rất nhiều và đọc rất nhiều bài báo trước khi đặt câu hỏi này tại đây. Không có bài báo nào cho tôi câu trả lời đúng.QThread xong() kết nối với deletelater của QObject
http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
đối tượng lao động có mối quan hệ của các chủ đề mới.
1> Tín hiệu hoàn thành công việc sẽ gọi thoát() trên chuỗi. Điều này sẽ kết thúc vòng lặp sự kiện của luồng và khởi tạo tín hiệu hoàn thành luồng.
2> Tín hiệu hoàn thành công nhân được kết nối với công nhân deleteLater(). Theo tài liệu deleteLater()
** Lên lịch đối tượng này để xóa. Đối tượng sẽ bị xóa khi điều khiển quay trở lại vòng lặp sự kiện. Nếu vòng lặp sự kiện> không chạy
khi chức năng này được gọi (ví dụ: deleteLater() được gọi trên đối tượng trước QCoreApplication :: exec()), đối tượng sẽ bị xóa sau khi vòng lặp sự kiện được bắt đầu.
Lưu ý rằng việc nhập và rời khỏi vòng lặp sự kiện mới (ví dụ: bằng cách mở hộp thoại phương thức) sẽ không thực hiện xóa bị trì hoãn; đối tượng cần xóa, điều khiển phải quay lại vòng lặp sự kiện mà từ đó deleteLater() được gọi.
Lưu ý: an toàn để gọi chức năng này nhiều lần; khi thu nhập hoãn lại sự kiện xóa đầu tiên được phân phối, bất kỳ sự kiện cấp phát cho các đối tượng được loại bỏ khỏi hàng đợi sự kiện. **
Vì vậy, khi không có eventloop, vì các chủ đề đã thoát khỏi và nó đã lớn lên tín hiệu đã hoàn thành và chúng tôi sẽ không còn bắt đầu lại cùng một luồng nữa. Trong trường hợp này, hàm deleteLater() sẽ không bao giờ được xử lý vì vòng lặp sự kiện không tồn tại và đối tượng công nhân sẽ không bị xóa. Điều này không tạo ra một rò rỉ bộ nhớ.?
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
Nếu chúng tôi nghĩ rằng việc trao đổi hai dòng sẽ khắc phục được sự cố thì tôi có một câu hỏi khác. QT nêu rõ rằng thứ tự các khe được gọi khi tín hiệu được phát ra là chưa được xác định
Có nhiều nhận xét trong liên kết bài viết được đề cập ở trên. Thậm chí tác giả đã không thể trả lời câu hỏi hoàn toàn
Bạn không thể xóa người lao động trong các chủ đề đối tượng được tạo ra. vì nó đã được chuyển đến Thread bằng cách sử dụng moveToThread. Bạn có thể giải thích điều này. – Srikan
Ngoài ra tôi sẽ khuyên bạn chỉ định một phụ huynh cho 'QThread'.Vì thể hiện của 'QThread' là một phần của chuỗi mà nó được sinh ra (không giống như bất kỳ đối tượng nào đã được chuyển đến nó hoặc phương thức' run() 'của nó), nên hoàn toàn an toàn khi thực hiện' thread = new QThread (this); 'if' thread' là một phần của một số lớp khác. Nói chung, bạn nên tránh gọi 'xóa' nếu có giải pháp không hướng dẫn tốt hơn. Ngay cả trong tiêu chuẩn C++ bạn có con trỏ thông minh và những gì không phải mất gánh nặng bằng tay làm sạch lên khỏi vai của bạn. – rbaleksandar