- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我只想传递移动类型(std::unique_ptr
只是最短的例子),实现我想在 Qt 线程池中执行的功能,但是这样的代码会产生编译时错误:
#include <QtConcurrent>
#include <memory>
void f(std::unique_ptr<int>)
{
}
int main() {
std::unique_ptr<int> p{new int{5}};
QtConcurrent::run(f, std::move(p));
}
编译器提示这样的函数(Qt QtConcurrent/qtconcurrentrun.h
的一部分):
template <typename T, typename Param1, typename Arg1>
QFuture<T> run(T (*functionPointer)(Param1), const Arg1 &arg1)
{
return (new StoredFunctorCall1<T, T (*)(Param1), Arg1>(functionPointer, arg1))->start();
}
需要std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [с _Tp = int; _Dp = std::default_delete<int>]
换句话说,它使用复制而不是移动。
对于接受 Function
的其他 Qt 函数,我只使用 C++11 , 比如 QObject::connect
我用 std::bind
技巧:
std::bind([](const std::unique_ptr<int> &arg) {}, std::move(param));
但出于某种原因,这样的代码也无法编译:
std::unique_ptr<int> p{new int{5}};
auto func = std::bind([](std::unique_ptr<int>& a) {
//call f here
}, std::move(p));
QtConcurrent::run(func);
还提示 std::unique_ptr
的 delete copy constructor| .
我当然可以用 std::shared_ptr/QSharedPointer
解决它,但可能有人建议没有额外内存分配的方法吗?
最佳答案
总而言之,不幸的是,QtConcurrent 还不支持移动语义。
主要的解决方法是做 std::auto_ptr
所做的事情:在包装器中移动拷贝。很难,但是在将移动支持添加到 Qt 并发之前没有其他方法。不过,修补起来并不是什么特别困难的事情。
关于c++ - 在 c++11 模式下使用 QtConcurrent::run with move only 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49224755/
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 显示使用此方法没有内存泄漏,但程序的内
我是一名优秀的程序员,十分优秀!