Re: QRunnable - it makes it easier to schedule the tasks with a thread pool. Good if you have bounded tasks - with a clear end. So, you define a QRunnable and have the hard work done in the run(). If it's scheduled on a QThreadPool, it will run and clean up on its own. How you collect the results it generates is up to you to define. It means you can run a bunch of instances of the same runnable with different inputs, and the lifetime of the threads is managed by the thread pool for you.