Qt编程和计算需要很长时间

时间:2011-11-28 19:11:35

标签: c++ multithreading qt

我是Qt编程的新手。我必须做一些需要很长时间的计算。我使用一个编辑框和两个名为“开始”和“停止”的按钮。编辑框用于初始化。 “开始”按钮开始计算。在计算进行的同时,我必须能够随时停止计算。但是当我通过单击开始按钮开始计算时。正如预期的那样,在计算完成之前,我无法单击窗口上的任何组件。

我想在计算执行时正常使用窗口上的组件(尤其是停止按钮)。但我对线程并不擅长,我正在寻找一种更简单的方法。有没有简单的解决方案?

4 个答案:

答案 0 :(得分:16)

有几种选择。

1。子类QRunnable

子类QRunnable并使用QThreadPool在单独的线程中运行它。要与UI通信,请使用信号。例如:

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

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

请注意,您无需担心管理线程或QRunnable的生命周期。对于通信,您可以在启动QRunnable之前连接自定义信号。

2。使用QtConcurrent::run

这是一种不同的方法,可能不适合您的问题。基本上,它的工作方式如下:您可以处理长任务的未来返回值。当您尝试检索return value时,它会立即将其提供给您,或者等待任务完成(如果尚未完成)。例如:

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

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

3。子类QThread

你可能不需要这个,但也不难。这个与#1非常相似,但您需要自己管理线程。例如:

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();

与QRunnable类似,您可以使用信号与UI进行通信。

答案 1 :(得分:3)

在计算中,您可以放置​​QCoreApplication::processEvents();,以便处理GUI事件。这将省略线程的使用。

答案 2 :(得分:1)

您可以在与GUI不同的线程中进行计算。当GUI收到按下停止按钮的信号时,您将更改计算线程定期检查的标志值。设置标志后,您可以终止计算线程。

答案 3 :(得分:0)

使用线程(可能通过将管道上的消息发送给self来同步它们),或者使用timer(延迟为0毫秒,这就是在Qt中完成空闲处理的方式)。