Чтобы тема приобрела какой-то завершенный вид, я доработал пример, добавив в него вспомогательный класс WorkerPool и поток poolThread для него. Класс служит для хранения указателей на worker'ы в виде простого списка и их удаления в своем потоке (чтобы wait сработал, как надо). Здесь создаются 2 worker'а:
C++ (Qt)
Controller::Controller(QObject *parent) : QObject(parent)
{
WorkerPool* pool = new WorkerPool;
connect(&poolThread, &QThread::finished, pool, &QObject::deleteLater);
pool->moveToThread(&poolThread);
poolThread.start();
for(int i=0; i<2; i++) {
Worker *worker = new Worker(i);
pool->append(worker);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
}
connect(&timer, &QTimer::timeout, [this]() { emit operate("do it"); });
}
Удаление pool выполняется по сигналу завершения вспомогательного потока finished, поток завершается в деструкторе контроллера:
C++ (Qt)
Controller::~Controller() {
poolThread.quit();
poolThread.wait();
}
В деструкторе пула удаляются worker'ы оператором delete (это необходимо, чтобы вызвать деструктор worker'а в потоке пула):
C++ (Qt)
WorkerPool::~WorkerPool() {
for(auto worker: pool) {
delete worker;
}
}
Вот такой вывод этого примера (в начале каждого сообщения - идентификатор потока:
0x33E8 pool created
0x33E8 worker 1 created
0x33E8 worker 2 created
start work
0x0ef4 do it 1: done
0x3e78 do it 2: done
0x0ef4 do it 1: done
0x3e78 do it 2: done
0x0ef4 do it 1: done
0x3e78 do it 2: done
end work
0x3BBC worker 1 deleted
0x3BBC worker 2 deleted
0x3BBC pool deleted
Напомню, что идея не моя)) Если интересно, то первоисточник тут:
https://github.com/StefanFrings/QtWebApp/blob/master/QtWebApp/httpserver/httpconnectionhandler.cppТам не все очевидно, автор мне подсказал, что удаление выполняется в HttpConnectionHandlerPool::cleanup().