Unless you have left out critical code, you do not seem to be ensuring thread safety. You need a QWaitCondition and a QMutex. Check out the mandelbrot example.
Here is the relevant code for a safe construction of a worker thread.
Qt Code:
  1. class JobThread : public QThread
  2. {
  3. public:
  4. JobThread(QObject *parent)
  5. : QThread(parent)
  6. {
  7. abort = false;
  8. start(LowPriority);
  9. }
  10.  
  11. ~JobThread()
  12. {
  13. mutex.lock();
  14. abort = true;
  15. condition.wakeOne();
  16. mutex.unlock();
  17. wait();
  18. }
  19.  
  20. void addJob(Job job)
  21. {
  22. QMutexLocker locker(&mutex);
  23. this->jobs << job;
  24. condition.wakeOne();
  25. }
  26.  
  27. void run()
  28. {
  29. QMutexLocker lock(&mutex);
  30. while(!abort) {
  31. if (!jobs.isEmpty())
  32. {
  33. condition.wait(&mutex);
  34. continue;
  35. }
  36. Job job = jobs.takeFirst();
  37. lock.unlock();
  38.  
  39. while (!abort) {
  40. // do heavy computing
  41. process(job);
  42. emit progress(...);
  43. }
  44. lock.relock();
  45. }
  46. }
  47. private:
  48. mutable bool abort;
  49. QMutex mutex;
  50. QWaitCondition condition;
  51. QList<Job> jobs;
  52. };
To copy to clipboard, switch view to plain text mode 
I would also consider using QtConcurrent.