gpt4 book ai didi

multithreading - 实现 QThread 的正确方法是什么...(请举例...)

转载 作者:行者123 更新时间:2023-12-03 05:39:42 25 4
gpt4 key购买 nike

QThread 的 Qt 文档说要从 QThread 创建一个类,并实现 run 方法。

以下摘自 4.7 Qthread 文档...

To create your own threads, subclass QThread and reimplement run(). For example:

 class MyThread : public QThread
{
public:
void run();
};

void MyThread::run()
{
QTcpSocket socket;
// connect QTcpSocket's signals somewhere meaningful
...
socket.connectToHost(hostName, portNumber);
exec();
}

因此,在我创建的每个线程中,我都这样做了,并且对于大多数事情来说它都工作得很好(我没有在我的任何对象中实现 moveToThread(this) 并且它工作得很好)。

上周我遇到了一个障碍(通过解决我创建对象的位置设法解决了这个问题)并找到了 following blog post 。这里基本上是说子类化 QThread 实际上不是正确的方法(并且文档不正确)。

这是来自一位 Qt 开发人员,所以乍一看我很感兴趣,经过进一步思考,我同意他的观点。遵循面向对象原则,您实际上只想子类化一个类以进一步增强该类...而不是直接使用类方法...这就是您实例化的原因...

假设我想将自定义 QObject 类移动到线程...“正确”的做法是什么?在那篇博客文章中,他“说”他在某处有一个例子......但如果有人可以进一步向我解释它,我将不胜感激!

更新:

由于这个问题引起了如此多的关注,这里是 4.8 文档的复制和粘贴,其中包含实现 QThread 的“正确”方法。

class Worker : public QObject
{
Q_OBJECT
QThread workerThread;

public slots:
void doWork(const QString &parameter) {
// ...
emit resultReady(result);
}

signals:
void resultReady(const QString &result);
};

class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};

我仍然认为值得指出的是,它们包含了一个额外的 Worker::workerThread 成员,该成员是不必要的,并且在其示例中从未使用过。删除该部分,它就是如何在 Qt 中执行线程的正确示例。

最佳答案

我唯一能想到添加的是进一步声明 QObject 与单个线程具有亲和性。这通常是创建QObject的线程。因此,如果您在应用的主线程中创建了一个QObject,并希望在另一个线程中使用它,则需要使用moveToThread()来更改亲和性。

这样就不必子类化 QThread 并在 run() 方法中创建对象,从而使您的内容得到很好的封装。

该博文确实包含指向 example 的链接。它很短,但展示了基本思想。创建您的QObject,连接您的信号,创建您的QThread,将您的QObjects移动到QThread并启动线。信号/槽机制将确保正确且安全地跨越线程边界。

如果您必须在该机制之外调用对象上的方法,则可能必须引入同步。

我知道 Qt 还有其他一些不错的 threading facilities除了可能值得熟悉的线程之外,但我还没有这样做:)

关于multithreading - 实现 QThread 的正确方法是什么...(请举例...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093159/

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