- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个 Tile 渲染程序。这是一些基本代码。
标题
class Tile: public QGraphicsItem
{
public:
Tile(void);
~Tile(void);
QGraphicsPixmapItem *tileItem;
void update(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
protected:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
};
CPP:
.Constructor etc
.
.
void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(tileItem==NULL)
{
qDebug()<<"Loading Pixmap";
QPixmap p("c:\\qt\\tile\\tile0-0.png");
tileItem=new QGraphicsPixmapItem;
tileItem->setPixmap(p);
}
tileItem->paint(painter,option,widget);
}
我正在尝试制作一个将大图像的图 block 粘贴到 QGraphicsScene 上的应用程序。但是一次加载所有图 block 非常耗时并且占用大量内存。所以我继承了 QGraphicsItem 并重写了 paint。 QGraphicsItem 类中的 paint 方法只有在 QGraphicsView 中出现时才会被调用。因此,通过在绘画中加载我的图 block ,我基本上可以创建一个仅在图 block 出现时才加载图 block 的应用程序。到目前为止,这一切都在起作用。
为了改善用户体验,我使用 QtConcurrent 尝试在单独的线程中加载磁贴。所以这是我所做的更改。
CPP
connect(&watcher,SIGNAL(finished()),this,SLOT(updateSceneSlot()));
void Tile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
if(tileItem==NULL)
{
TilePainter=painter;
TileOption=option;
TileWidget=widget;
qDebug()<<"Paint Thread id "<< QThread::currentThread();
future=QtConcurrent::run(LoadTilePixmap,this);
watcher.setFuture(future);
}
else
tileItem->paint(painter, option, widget);
}
LoadTilePixmap 函数:
void LoadTilePixmap(Tile *temp,QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
qDebug()<<"Loading Pixmap";
QPixmap p("c:\\qt\\tile\\tile0-0.png");
temp->tileItem=new QGraphicsPixmapItem;
temp->tileItem->setPixmap(p);
qDebug()<<"Loaded Pixmap";
}
void Tile::updateSceneSlot()
{
qDebug()<<"updateSceneSlot Thread id "<< QThread::currentThread();
tileItem->paint(TilePainter, TileOption, TileWidget);
}
这段代码应该可以工作,但是一旦调用 paint,它就会在运行时崩溃。添加断点后,我将问题缩小到导致崩溃的 temp->tileItem->paint(painter,option,widget);
。
我得到的输出是
Loading Pixmap
Almost Loaded Pixmap
First-chance exception at 0x6526174a (QtGuid4.dll) in Visualizer.exe: 0xC0000005: Access violation reading location 0xc88bffe1.
Unhandled exception at 0x6526174a (QtGuid4.dll) in Visualizer.exe: 0xC0000005: Access violation reading location 0xc88bffe1.
谁能帮我告诉我 laSTLine/paint 方法崩溃的原因。我该如何解决?
编辑代码以更新更改
最佳答案
只有主(也称为 GUI)线程可以在屏幕上绘制。LoadTilePixmap() 函数中的以下行,您在单独的线程中运行,我相信,尝试在屏幕上绘制您的像素图项目的内容。
temp->tileItem->paint(painter,option,widget);
在线程中,您应该只加载和准备图像,当线程完成时,向主线程发出图像已准备就绪的信号,并从主线程进行绘图。
关于c++ - 使用 QtConcurrent 加载 Pixmap 并绘制它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951072/
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 显示使用此方法没有内存泄漏,但程序的内
我是一名优秀的程序员,十分优秀!