好的,所以我问了几个关于 QFuture 的问题,这是我目前用来线程化我的 UI 应用程序的。
基本上我在一个需要很长时间的类中有一个函数,所以我自然希望它线程化,所以当从我的 UI 类调用它时,它不会只是锁定我的 UI。
然后我实现了一个 QFutureWatcher 来等待 finished() 信号,此时它将启动另一个函数,该函数在一个新线程中花费了很长时间(但是这个函数正在对 UI 做一些事情)。我使用相同的代码来实现第二个线程函数,但是这个函数仍然锁定了我的 UI。
我得出的结论可能完全错误,但我似乎无法找出为什么它不起作用所以我所能做的就是假设并在这里问......
也许我不能有 2 个使用 QConcurrentRun 的 QFuture
不能将 QFuture 与 ui 的东西一起使用(在我的情况下 QGraphicsView 添加到场景)
如果有人有很棒的建议,请在另一篇文章中阅读,我可能应该将 QObject 子类化,但没有给出示例,所以我无法真正实现这一点,因为我什至不知道我打算重新实现什么样的功能..
TLDR:如何线程化一个对 UI 起作用的函数(添加到 QGraphicsScene)
代码示例,这是一个需要很长时间的函数,因为我从不同的函数循环调用这个函数几十万次,大约需要 30 秒才能完成,此时 UI 没有响应
void GUI::paintSomething(double x, double y)
{
/// Decalre a QPen for Painting dots
QPen pen;
// set the pen colour
pen.setColor(Qt::white);
// Add ellipse at the x y position passed in
scene->addEllipse(x, y, 1.5, 1.5, pen, QBrush(Qt::SolidPattern));
}
线程代码,paint都是调用paintSomething的函数
*future2 = QtConcurrent::run(this, &GUI::paintAll);
// Set watcher to look at QFuture futre2
watcher2->setFuture(*future2);