我是Qt编程的新手。我必须做一些需要很长时间的计算。我使用一个编辑框和两个名为“开始”和“停止”的按钮。编辑框用于初始化。 “开始”按钮开始计算。在计算进行的同时,我必须能够随时停止计算。但是当我通过单击开始按钮开始计算时。正如预期的那样,在计算完成之前,我无法单击窗口上的任何组件。
我想在计算执行时正常使用窗口上的组件(尤其是停止按钮)。但我对线程并不擅长,我正在寻找一种更简单的方法。有没有简单的解决方案?
答案 0 :(得分:16)
有几种选择。
子类QRunnable并使用QThreadPool在单独的线程中运行它。要与UI通信,请使用信号。例如:
class LongTask: public QRunnable
{
void run()
{
// long running task
}
};
QThreadPool::globalInstance()->start(new LongTask);
请注意,您无需担心管理线程或QRunnable的生命周期。对于通信,您可以在启动QRunnable之前连接自定义信号。
这是一种不同的方法,可能不适合您的问题。基本上,它的工作方式如下:您可以处理长任务的未来返回值。当您尝试检索return value时,它会立即将其提供给您,或者等待任务完成(如果尚未完成)。例如:
QFuture<int> future = QtConcurrent::run(longProcessing, param1, param2);
// later, perhaps in a different function:
int result = future.result();
你可能不需要这个,但也不难。这个与#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中完成空闲处理的方式)。