- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做一个项目,使用 Qt GUI C++ 5.6.2 在窗口上创建一些图形。我有两个名为“createVerticalSpeedIndicator”和“createAirSpeedIndicator”的方法。这些方法需要使用 while(1) 循环创建一些图形并使用 qApp->processEvents();在窗口上,当其中一个正在工作而另一个处于非事件状态时,他们做得很完美。但我需要同时且始终运行它们。
我该怎么做才能同时且始终运行它们。
非常感谢
最佳答案
解决方案是反转控制流。 while() { ... processEvents() ... }
是异步代码中的反模式,因为它假设您拥有控制点,而实际上您没有。您很幸运,没有耗尽堆栈,因为 processEvents
可能会重新进入 createXxx
方法。
这是一个完整的转换示例:
// Input
void Class::createVerticalSpeedIndicator() {
for (int i = 0; i < 100; i ++) {
doStep(i);
QCoreApplication::processEvents();
}
}
// Step 1 - factor out state
void Class::createVerticalSpeedIndicator() {
int i = 0;
while (i < 100) {
doStep(i);
QCoreApplication::processEvents();
i++;
}
};
// Step 2 - convert to continuation form
void Class::createVerticalSpeedIndicator() {
int i = 0;
auto continuation = [=]() mutable {
if (!(i < 100))
return false;
doStep(i);
QCoreApplication::processEvents();
i++;
return true;
};
while (continuation());
};
// Step 3 - execute the continuation asynchronously
auto Class::createVerticalSpeedIndicator() {
int i = 0;
return async(this, [=]() mutable {
if (!(i < 100))
return false;
doStep(i);
i++; // note the removal of processEvents here
return true;
});
};
template <typename F> void async(QObject * parent, F && continuation) {
auto timer = new QTimer(parent);
timer->start(0);
connect(timer, &QTimer::timeout, [timer, c = std::move(continuation)]{
if (!c())
timer->deleteLater();
});
}
此时,您可以将相同的转换应用于 createAirSpeedIndicator
并在类的构造函数中启动它们:
Class::Class(QWidget * parent) : QWidget(parent) {
...
createVerticalSpeedIndicator();
createAirSpeedIndicator();
}
两个任务都将在主线程中异步且伪并发地运行,即每个任务将交替执行一个步骤。
假设我们想要链接任务,即只有在前一个任务完成后才开始任务。用户代码中的修改可以很简单:
Class::Class(QWidget * parent) : QWidget(parent) {
...
createVerticalSpeedIndicator()
>> createAirSpeedIndicator()
>> someOtherTask();
}
async
函数现在必须返回一个允许建立此类连接的类:
struct TaskTimer {
QTimer * timer;
TaskTimer & operator>>(const TaskTimer & next) {
next.timer->stop();
connect(timer, &QObject::destroyed, next.timer, [timer = next.timer]{
timer->start(0);
});
timer = next.timer;
return *this;
}
};
template <typename F> TaskTimer async(QObject * parent, F && continuation) {
TaskTimer task{new QTimer(parent)};
task.timer->start(0);
connect(task.timer, &QTimer::timeout,
[timer = task.timer, c = std::move(continuation)]{
if (!c())
timer->deleteLater();
});
return task;
}
关于c++ - Qt 多个异步 While 循环和 qApp->processEvents();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44319577/
我正在尝试使用 setFont() 方法来设置应用程序范围内更改的字体。我尝试了以下方法: qApp->setFont(); 然而,setFont()不是qApp的一个方法。我不确定如何为整个应用程序
我正在尝试使用 setFont() 方法来设置应用程序范围内更改的字体。我尝试了以下方法: qApp->setFont(); 然而,setFont()不是qApp的一个方法。我不确定如何为整个应用程序
我正在使用 QT 属性系统,我想在修改属性后立即运行特定函数。我关注了Qt documentation设置我的属性(property)及其不同的“插槽”(读、写、通知): class MyClass
据我所知,qApp 是全局指针,因此它应该可以在任何地方访问,但我收到此错误 error: qApp was not declared in this scope。 1 #include "tex
使用 PyQt5,这两个都返回应用程序对象: app = QtWidgets.QApplication.instance() app = QtWidgets.qApp for i in app.arg
我试图用 Qt 语言学家创建一个 Qt 应用程序多语言。我将这段代码放在我的 MainWindow 的一个函数中: translator.load(":/lang/English"); qApp->i
我正在尝试做一个项目,使用 Qt GUI C++ 5.6.2 在窗口上创建一些图形。我有两个名为“createVerticalSpeedIndicator”和“createAirSpeedIndica
如果我使用的是 QApplication 实例,调用 qApp->exec() 或 QCoreApplication::exec() 是否有效?因为它是一个静态函数,所以在这两种情况下 QCoreAp
我有一个执行大量 IO 的循环,所以我不时调用 qApp->processEvents() 以保持 GUI 的 react 性。在 Linux 上,这会导致严重错误,因为提前调用了事件。 是否有可能从
我正在尝试动态更改我的应用程序语言: void MainWindow::ChangeEvent(QEvent *event, QString *language) { if (event->t
我没有在 Qt 文档中找到解释 qApp->setProperty() 选项的部分(它可能在那里,但我不能'找不到它)。有人可以基本上向我解释它是如何工作的以及我应该在什么时候使用它吗? 我问它是因为
我的应用程序绘制图像并为其添加标签。当窗口在等待输入时关闭,应用程序仍然在后台运行。这是我的捕获标签的函数示例。我是否遗漏了一些让程序正常退出的东西? void CustomMainWindow::
你好, 我正在使用 QT (C++) 为自己开发一个小型“ServerManager”。到目前为止一切正常: 我使用 QSettings存储所有相关设置(如服务器、已安装的插件等)。 因为我不想实例化
如果我在桌面(Linux 或 Windows)上使用,在应用程序中使用 qApp->primaryScreen()->availableGeometry(); 时获取可用屏幕的大小,这对我是因为应用程
我是一名优秀的程序员,十分优秀!