- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的项目是创建一个小程序来演示搜索引擎的工作:为任意查询建立索引并返回结果。我已经完成了索引器部分的工作,现在我想通过一次索引多个文件来改进它。 MainWindow 类在这里:
class MainWindow : public QMainWindow
{
Q_OBJECT
.....
private:
Indexer * indexer;
QStringList fileList;
....
void index(QStringList list);
void add(const QString &filename);
}
这是add
的实现(add
需要访问fileList
以避免再次索引相同的文件,因此它不能是静态的方法):
void MainWindow::add(const QString &filename)
{
if (!fileList.contains(filename))
{
indexer->addDocument(filename.toStdString());
fileList.append(filename);
qDebug() << "Indexed" << filename;
emit updatedList(fileList);
}
}
index
方法的实现是接收一个文件列表并在每个文件名上调用add
:
void MainWindow::index(QStringList list)
{
....
QtConcurrent::map(list, &MainWindow::add);
....
}
我在编译这些代码时收到的错误是:
usr/include/qt4/QtCore/qtconcurrentmapkernel.h: In member function 'bool QtConcurrent::MapKernel<Iterator, MapFunctor>::runIteration(Iterator, int, void*) [with Iterator = QList<QString>::iterator, MapFunctor = QtConcurrent::MemberFunctionWrapper1<void, MainWindow, const QString&>]':
../search-engine/mainwindow.cpp:361:1: instantiated from here
/usr/include/qt4/QtCore/qtconcurrentmapkernel.h:73:9: error: no match for call to '(QtConcurrent::MemberFunctionWrapper1<void, MainWindow, const QString&>) (QString&)'
/usr/include/qt4/QtCore/qtconcurrentfunctionwrappers.h:128:7: note: candidate is:
/usr/include/qt4/QtCore/qtconcurrentfunctionwrappers.h:138:14: note: T QtConcurrent::MemberFunctionWrapper1<T, C, U>::operator()(C&, U) [with T = void, C = MainWindow, U = const QString&]
/usr/include/qt4/QtCore/qtconcurrentfunctionwrappers.h:138:14: note: candidate expects 2 arguments, 1 provided
我不太熟悉 QtConcurrent 的工作原理,文档也没有提供太多关于它的详细信息。我真的希望这里有人可以提供帮助。提前致谢。
最佳答案
为了能够调用指向成员的指针,除了函数形式参数之外,您还需要该类的实例(您在成员函数中获得的 this
指针)。
有两种方法可以处理这个问题:创建一个简单的仿函数来包装调用,或者使用 lambda。
仿函数看起来像这样:
struct AddWrapper {
MainWindow *instance;
AddWrapper(MainWindow *w): instance(w) {}
void operator()(QString const& data) {
instance->add(data);
}
};
你会像这样使用它:
AddWrapper wrap(this);
QtConcurrent::map(list, wrap);
(不过,请注意该包装器的生命周期。您可以使其更通用 - 例如,您还可以在包装器中存储一个指向成员的指针,和/或如果您想重用该结构,则将其设为模板其他类型。)
如果你有一个带有 lambda 的 C++11 编译器,你可以避免所有这些样板:
QtConcurrent::map(list, [this] (QString const& data) { add(data); });
注意:我不确定 QtConcurrent::MemberFunctionWrapper1
是如何参与您的示例的,我在这里没有看到。因此,对于这种情况,Qt 中可能已经有一个通用包装器,但我不知道。
关于multithreading - 带有成员函数的 QtConcurrent::map() = 无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10361044/
Qt 文档说明了以下关于 QtConcurrent::blockingMap 的内容: Note: This function will block until all items in the se
我有一个应用程序,它可能会长时间运行任务,也可能有成千上万个结果。 这个特定的应用程序(下面的代码)没有任何值(value),但是它旨在提供一个通用的用例,即在成千上万的结果中保持响应式UI的需求。
我有一个递归目录复制功能,我想在后台运行。该函数有两个 QString 参数,文件路径和目录。 来自.pro: QT += core gui sql network concurrent greate
我已经设计了一种算法,现在我正在研究实现以在多核上解决它。基本上我给每个核心相同的问题,我会选择得分最高的解决方案。但是,我注意到使用多核会减慢代码的运行时间,但我不明白为什么。所以我创建了一个非常简
在 Qt 4.7 Reference for QThreadPool 中,我们发现: void QThreadPool::releaseThread() Releases a thread previ
我在我的应用程序中构建了一个基于 QFuture 的异步网络外观。大致是这样工作的: namespace NetworkFacade { QByteArray syncGet(const QU
我正在用 QT 做多线程程序。 我使用此代码来尝试它是否按我预期的那样工作。 QFuture t1 = QtConcurrent::run(thread_process1, (void *)this)
我在项目列表上运行 QTConcurrent::Map 以执行一些图像处理任务。这在只有几个线程的机器上运行良好,但由于我的处理代码的内存需求,在具有大量线程的机器上会遇到问题。 是否可以为 QTCo
我想用 QtConcurrent::map 运行一个函数,但总是出错......我在主窗口中有两个函数:on_listWidget_itemClicked 和 _fillTreeWithList(QS
我想在 Qt 中从我使用 QtConcurrent::run 调用的函数发出信号 这可能吗?看来我的槽位永远不会被调用。所有信号、槽和函数都是同一类对象的一部分。我尝试在主线程和从线程中建立连接。我并
我目前正在学习用于多线程应用程序的QtConncurrenct。因此,出于测试目的,我决定实现一个简单的程序,对列表中的整数求和,代码如下: #include #include #includ
你好,我正在尝试将 QList 传递给 QtConcurrent::Map 函数,但它无法启动,我不明白为什么,也许有人知道可能是什么问题? 这是类方法代码 void MainWindow::find
如何将 QtConcurrent::mapped 与成员函数一起用作运算符?目前我正在使用一个可调用对象(这是一个丑陋的解决方案): struct Vectorizer { Vectorize
这个问题在这里已经有了答案: is it possible to use QtConcurrent::run() with a function member of a class (2 个答案)
我使用 QtConcurrence 在单独的线程中运行一个函数,但我想停止、暂停或终止该线程,但我做不到。我读了这个: Note that the QFuture returned by QtConc
我在网上找到了一些引用文献,其中人们说这行不通,但他们从未解释过为什么这行不通。 在伪代码中我正在做这样的事情: void MyObject::doWork() { QList worklis
我有一个用于将文件压缩成不同格式的类。我正在尝试使用 QtConcurrent 在后台运行压缩。有了这个,我有两个功能: 将文件路径作为字符串和压缩格式 获取文件路径和压缩格式的 vector 问题是
我正在尝试将一个成员函数传递给 QtConcurrent::run() 我试过这样做: GDALDriver *poNITFDriver; future = QtConcurrent::run(poN
我试图在另一个线程中运行非静态成员函数。如果我去: void *(PortManager::*innerAskPtr)() = &this->innerAsk; QFuture f = QtConcu
我正在尝试实现预加载与另一个线程中请求的图像相邻的图像,并将它们存储在 QPixmapCache 中,但即使我不存储图像,似乎也存在内存泄漏。 Valgrind 显示使用此方法没有内存泄漏,但程序的内
我是一名优秀的程序员,十分优秀!