gpt4 book ai didi

multithreading - QThread 中的 Worker

转载 作者:行者123 更新时间:2023-12-03 13:19:40 25 4
gpt4 key购买 nike

我在 QThread 中有一个工作对象,在无限循环中运行一些东西。
在某处我看到一个代码,在工作人员中有例如'checkStatus()'方法返回一些 bool 值。这个方法不是 slot,而是一个公共(public)方法。我感兴趣的是,如果这个工作对象已经被移动到 QThread 并且正在运行它的无限循环,那么从主线程调用这个方法是否安全?我不应该改用信号槽吗?

我在主窗口的构造函数中尝试了这样的事情:

....
startDataInputSlot(); // starting thread and moving worker into thread

while(1) dataInputWorker->checkStoppedStatus(); // trying to access some variables in worker object

....

startDataInputSlot() 启动了一个线程并将工作线程移动到该线程中。在worker的无限循环中,它会定期检查下一个无限循环(在主窗口中)尝试访问的值。没有使用 QMutex,程序正常运行而不会崩溃。这可以安全使用吗?

最佳答案

在没有互斥锁的情况下直接访问工作人员成员是不安全的。
这是如何实现它的示例:

class Worker : public QObject
{
public slots:
void doHeavyJob()

public:
bool getStatus();

private:
int data;
QMutex mutex;
}
doHeavyJob是修改 data 的主要工作函数多变的。它应该通过信号槽机制启动,因为在这种情况下它将在工作线程中运行:
void Worker::doHeavyJob()
{
while (true)
{
mutex.lock();

// do something with the data
data++;

mutex.unlock();
}
}

QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);

connect(thread, SIGNAL(started()), worker, SLOT(doHeavyJob()));

thread->start();

在这里,您可以直接从另一个(主)线程检查工作人员状态:
bool Worker::getStatus()
{
bool isGood;

mutex.lock();
isGood = data > 10;
mutex.unlock();

return isGood;
}

内部 getStatus你应该锁定 data变量,因为它可以在 doHeavyJob 内部更改在工作线程中运行的插槽。

你也不能启动 getStatus函数作为一个槽,因为它只会在控制返回到工作线程事件循环时执行,但如果你有 'infinite' doHeavyJob功能,它永远不会发生。

关于multithreading - QThread 中的 Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28484149/

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