Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt Programming and computations which take long time

I am new on Qt programming. I have to make some computations which take long time. I use an edit box and two button named as "start" and "stop". The edit box is used for the initialization. Start button starts the computation. While the computation is going on, I must be able to stop the computation whenever I want. But when I start the computation by clicking the start button. As expected, I cannot click any component on the window until the computation is completed.

I want to use the components (especially stop button) on the window normally while the computation is performing. But I am not good on the threads, I am looking for an easier method. Is there any simple solution?

like image 924
adba Avatar asked Dec 01 '22 07:12

adba


1 Answers

There are a couple of options.

1. Subclass QRunnable

Subclass QRunnable and use QThreadPool to run it in a separate thread. To communicate with the UI, use signals. Example of this:

class LongTask: public QRunnable
{
    void run()
    {
       // long running task
    }
};

QThreadPool::globalInstance()->start(new LongTask);

Note that you don't need to worry about managing the thread or the lifetime of your QRunnable. For communicating, you can connect your custom signals before starting the QRunnable.

2. Use QtConcurrent::run

This is a different approach and might not suit your problem. Basically, the way it works is the following: you get a handle to the future return value of the long task. When you try to retrieve the return value, it will either give it to you immediately or wait for the task to finish if it hasn't already. Example:

QFuture<int> future = QtConcurrent::run(longProcessing, param1, param2);

// later, perhaps in a different function:
int result = future.result();

3. Subclass QThread

You probably don't need this, but it isn't hard either. This one is very similar to #1 but you need to manage the thread yourself. Example:

class MyThread : public QThread
{
public:
    void run() 
    {
        // long running task
    }
};

QThread* thread = new MyThread(this); // this might be your UI or something in the QObject tree for easier resource management
thread.start();

Similarly to QRunnable, you can use signals to talk to the UI.

like image 195
Tamás Szelei Avatar answered Dec 05 '22 18:12

Tamás Szelei