You were already given the solution. You should call QThread::start() to begin the execution of the thread. QThread::start() does the actual work of starting a new thread and later then calls QThread::run() when appropriate, in the newly created thread. How do you expect a new thread to be started if you invoke run() directly? It won't magically begin a new thread. You are calling run() just like any other method. The GUI is frozen as long as your run() method keeps executing.