- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Qt 文档说明了以下关于 QtConcurrent::blockingMap 的内容:
Note: This function will block until all items in the sequence have been processed.
QtConcurrent::map 的文档在其他方面是相同的。它还返回 QFuture<void>
而不是 void
.
QFuture 的文档有以下评论:
The waitForFinished() function causes the calling thread to block and wait for the computation to finish, ensuring that all results are available.
因此,我预计 QtConcurrent::blockingMap(seq, f)
与 QtConcurrent::map(seq, f).waitForFinished()
相同.然而,事实并非如此。
#include <QObject>
#include <QtConcurrent>
class Foo : public QObject {
Q_OBJECT
public:
explicit Foo(QObject *parent = nullptr) : QObject(parent) {
connect(this, &Foo::signal, this, &Foo::slot, Qt::AutoConnection);
}
void startMapWithWaiting() {
qDebug("startMapWithWaiting");
slot_counter = 0;
std::atomic_int signal_counter = 0;
QtConcurrent::map(nums, [&](auto &&num) {
++signal_counter;
emit signal();
}).waitForFinished();
qDebug("result: %d signals, %d slots", int(signal_counter), int(slot_counter));
slot_counter = 0;
}
void startBlockingMap() {
qDebug("startBlockingMap");
slot_counter = 0;
std::atomic_int signal_counter = 0;
QtConcurrent::blockingMap(nums, [&](auto &&num) {
++signal_counter;
emit signal();
});
qDebug("result: %d signals, %d slots", int(signal_counter), int(slot_counter));
slot_counter = 0;
}
public slots:
void slot() { ++slot_counter; }
signals:
void signal();
private:
std::atomic_int slot_counter = 0;
std::vector<int> nums{1, 2, 5, 8};
};
#include "main.moc"
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
Foo *foo = new Foo(&app);
QTimer::singleShot(10, foo, [foo, &app]() {
foo->startMapWithWaiting();
foo->startBlockingMap();
app.quit();
});
return app.exec();
}
输出是
startMapWithWaiting
result: 4 signals, 4 slots
startBlockingMap
result: 4 signals, x slots
在哪里x
从 0 到 4 不等,具体取决于……某事。这令人困惑。
我想知道这两种方式有什么区别,我是如何误读文档的。
最佳答案
这两种方法的工作方式相同:所有 lambda 函数都在发出 4 个信号时终止。示例中调用的插槽的不同取决于 emit signal()
的工作方式。由于程序使用 Qt::AutoConnection
作为信号/槽:
Qt::DirectConnection
相同)。使用相同的示例可以得到不同的结果(x 个插槽)。这取决于全局线程池如何管理它的线程。在我的配置中,输出是:
startMapWithWaiting
result : 4 signals, 0 slots
startBlockingMap
result : 4 signals, 4 slots
要获得相同的结果,我们可以使用 Qt::DirectConnection 代替 Qt::AutoConnection 或在打印结果之前调整 QApplication::processEvent() :
QApplication::processEvents(); //<-- force slot() to be processed.
qDebug("result blocking : %d signals, %d slots", int(signal_counter), int(slot_counter));
关于c++ - QtConcurrent::blockingMap 与 QtConcurrent::map 和 waitForFinished,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53978796/
我在 Qt 中有一些 I/O 代码已移至 QRunnable为了避免阻塞 UI 线程。这会用一些排队的插槽回调以指示其进度。 但是我最近看到了一些问题,当 QRunnable 的所有者时被销毁它不能删
在以下代码中,省略 waitForFinished() 会使 QProcess 停止发出信号。它到底有什么问题?这是Qt Bug吗? (5.7)。请注意,此代码与 QtConcurrent 并行运行。
所以我已经使用 QtConcurrent::run 一段时间了,它很棒。但是现在我需要函数来返回一个对象。因此我使用伪代码 QFutureWatcher fw; QFuture t1 = QtConc
我使用下面的代码从命令行实用程序的标准输出中获取“帮助”。这段代码一直没有问题,直到今天早上有人遇到问题(出现的消息框表明该命令看起来很奇怪)。 我似乎无法重现该问题,因此我打算将其归因于系统异常,因
我需要做什么 我正在构建一个运行 exe 并将其输出通过管道传输到其他 exe 的 qt 应用程序。 (在我的例子中 ffmpeg | x265) 我做了什么 QProcess ffmpeg; QPr
Qt 文档说明了以下关于 QtConcurrent::blockingMap 的内容: Note: This function will block until all items in the se
我是一名优秀的程序员,十分优秀!