For some reason, the thread is not interrupted when calling thread-> exit (0);
Cut to a minimum.
There is a class Worker:
class Worker : public QObject { Q_OBJECT public: Worker(std::shared_ptr<ImageHandler>& handler); private: std::shared_ptr<ImageHandler> handler; public slots: void work() { this->handler->startHandler(); emit finished(this); } signals: void finished(Worker* worker); }; He is in the stream.
The Processes class manages multiple threads.
class Processes : public QObject { Q_OBJECT public: void addThread(std::shared_ptr<Worker>& worker); void runThread(std::shared_ptr<Worker>& worker); public slots: void removeThread(Worker* worker); private: QMap<std::shared_ptr<QThread>, std::shared_ptr<Worker>> processes; signals: void handled(Worker* worker); }; void Processes::addThread(std::shared_ptr<Worker>& worker) { std::shared_ptr<QThread> thread(new QThread()); worker->moveToThread(thread.get()); connect(thread.get(), SIGNAL(started()), worker.get(), SLOT(work())); this->processes.insert(thread, worker); } void Processes::runThread(std::shared_ptr<Worker> &worker) { std::shared_ptr<QThread> thread = processes.key(worker); thread->start(); } void Processes::removeThread(Worker* worker) { std::shared_ptr<QThread> thread; // Нахожу нужный поток. // ... thread.get()->exit(0); // Но он не прервался. this->processes.remove(thread); // Ошибка. Удаляется рабочий поток. } Next, initialize the Worker class object and start the thread.
void MainWindow::on_actionAdd_Noise_triggered() { std::shared_ptr<ImageHandler> handler(new AddNoiseHandler()); std::shared_ptr<Worker> worker(new Worker(handler)); // Поле класса MainWindow: Processes processes; processes.addThread(worker); connect(worker.get(), SIGNAL(finished(Worker*)), this, SLOT(updateAfterHandle(Worker*))); processes.runThread(worker); } void MainWindow::updateAfterHandle(Worker* worker) { // ... // Вызывает ошибку this->processes.removeThread(value); }