gpt4 book ai didi

c++ - QThreadPool & QRunnable & 静态函数

转载 作者:行者123 更新时间:2023-11-28 07:14:05 24 4
gpt4 key购买 nike

我正在编写一个路径跟踪器,并希望通过线程将其并行化。我有一个关于 QT 中多线程对象的设计问题,特别是关于 QRunnable 类。

在我下面的(伪代码)中,我有一个启动 PTRunnable 实例的类“PathTracer”,它扩展了 QRunnable。

向 QRunnable 对象传递一个指向创建它们的类的指针,以便每个 QRunnable 都可以访问该类 (doWork) 提供的静态方法是否合适?我的理由是,如果出于某种原因我希望禁用多线程,PathTracer 实例仍将在没有冗余的情况下实现必要的方法。

或者有更好的设计?私有(private)实例变量 m_data 会怎样? qrunnable 对象会在共享的 m_data 上运行,还是会制作指针数据的拷贝?

#include <QThreadPool>
#include <vector>

class PathTracer
{
public:
static void doWork(PathTracer * pt, Pixel pix);
protected:
void renderImage();
void modifyData();
private:
int m_data;
};

PathTracer::renderImage()
{
for (int x=0; x<width; x++)
{
for (int y=0; y<height; y++)
{
pixelblock.push_back(Pixel(x,y));
}
}
// pass instance of self to each worker
PTRunnable ptworker(this, pixelblock);
QThreadPool::globalInstance()->start(ptworker);
};

void modifyData()
{
m_data++;
}

static void PathTracer::doWork(PathTracer * pt, Point p)
{
pt->modifyData();
}

//////////////////////////////

class PTRunnable : public QRunnable
{
Q_OBJECT
public:
explicit PTRunnable(QObject *parent = 0);
PTRunnable(PathTracer * pt, PixelList pixels);
void run(); // runnable implementation goes here
signals:

public slots:

private:
PathTracer * m_pt; // owns pointer to pathtracer that spawned this
protected:

};


PTRunnable::PTRunnable(PathTracer * pt, PixelBlock block)
{
m_pt = pt;
}
void PTRunnable::run()
{
pt->doWork(this, block[0]);
}

最佳答案

更好的方法是让这些静态方法插入并从 QRunnable 实例发出信号/如果您希望从函数中获得一些返回值,则将信号发送回 QRunnable 对象。

这将是线程安全的,您不需要传递/存储任何指针 - 因为通过传递/存储指针,您会遇到尝试访问已删除对象的潜在风险。

如果你愿意,你可以将指向 PathTracer 的指针传递给 PTRunnable 的构造函数以连接所有信号和槽,但是将指针存储为类成员将是一个糟糕的设计理念 - 没有必要存储它,并存储它随着代码的增长,将来会很容易出错。

关于c++ - QThreadPool & QRunnable & 静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com