Yup, if I could create all task objects at once and then add them all to the queue, this would be the easiest solution. But there are two reasons why I don't want to do it like that: First of all, the number of tasks can be quite large, so I want to create the task objects "on demand". Secondly, the result of some of the tasks may create additional tasks, so "main" has to collect the result when a task finishes and, in some cases, append new tasks. That's why I was looking for a QThreadPool::waitForOne() or QThreadPool::waitForN(x) method. I think "my" solution does emulate a waitForOne() and it works for my application. I haven't implemented the "semaphore" solution yet. I guess something like "N = 2 * maxThreadCount()" would be sufficient. But I doubt I would see a noteworthy speed-up in my application, because tasks run for 1-2 seconds and the overhead should be negligible. Doesn't need to be the "optimal" solution for everybody. Still I think QThreadPool::waitForOne() could be useful...