C++ QtConcurrent::映射和指针列表
我在网上找到了一些参考资料,人们说这不管用,但他们从来没有解释为什么这不管用 在伪代码中,我做了如下操作:C++ QtConcurrent::映射和指针列表,c++,qt,qt5,C++,Qt,Qt5,我在网上找到了一些参考资料,人们说这不管用,但他们从来没有解释为什么这不管用 在伪代码中,我做了如下操作: void MyObject::doWork() { QList<Item *> worklist; for ( int i = 0; i < nitems; i++ ) { Item *item = getItem(i); if (item->isVisible()) { worklist.prepen
void MyObject::doWork() {
QList<Item *> worklist;
for ( int i = 0; i < nitems; i++ ) {
Item *item = getItem(i);
if (item->isVisible()) {
worklist.prepend(item);
} else {
worklist.append(item);
}
}
QtConcurrent::map(worklist, procfunc);
}
所有示例都创建对象列表,而不是指向对象的指针。这些对象通常实现Qt的“写时复制”语义,但这在我的应用程序中并没有多大意义
这可能吗?如果是,我做错了什么?如果没有,有人能解释一下是什么原因导致这一点不可能实现吗?如果您仔细阅读,文档会这么说。有两个类似的接口,QtConcurrent::map和QtConcurrent::mapped: QtConcurrent::mapped()接受一个输入序列和一个映射函数。 然后为序列中的每个项调用此映射函数,并 包含map函数返回值的新序列为 返回 如果要就地修改序列,请使用QtConcurrent::map() 这里的关键短语是,这修改了序列 我最初读到的是“地图”修改了对象的位置,“地图”制作了对象的新副本。。。但事实上,这些接口的不同之处在于顺序,而不是对象。在我的代码中,序列不在范围内,因为我假设它是在QtConcurrent内部处理的,但是因为我使用的接口应该在适当的位置修改序列,所以这不可能是真的。因此,所有的虚假数据
这意味着对于我尝试执行的作业,这是错误的API。如果Item具有成员函数
void Item::procMy()
然后将其包装为
void procfunc(Item*&Item){Item->procmimf();}
并使用它QtConcurrent::map(worklist,procfunc)代码>
如果只有一个void procThat(Item*Item)
,请将其包装为void procfunc(Item*&Item){procThat(Item);}
你能通过制作一个完整的测试用例来完成你的例子吗?worlist
变量的生存期是多少?工作列表
变量是本地范围,在调用QtConcurrent::map
后立即消失。我想这是问题的一部分。。。见下面我的答案。我从根本上误解了QtConcurrent::map
是在修改序列,而不是序列中的对象。
static void profunc(Item *);
static void profunc(Item *&); // Probably correct given the API definition