首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread工人

QThread工人
EN

Stack Overflow用户
提问于 2015-02-12 17:38:41
回答 1查看 1.7K关注 0票数 1

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

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

代码语言:javascript
复制
....
startDataInputSlot(); // starting thread and moving worker into thread

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

....

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-13 07:13:13

直接访问没有互斥的员工成员是不安全的。这是一个如何实现它的例子:

代码语言:javascript
复制
class Worker : public QObject
{
public slots:
    void doHeavyJob()

public:
    bool getStatus();

private:
    int data;
    QMutex mutex;
}

doHeavyJob是修改data变量的主要辅助函数。应该通过信号插槽机制启动它,因为在这种情况下,它将在工作线程中运行:

代码语言:javascript
复制
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();

在这里,您可以直接从另一个(主)线程检查worker状态:

代码语言:javascript
复制
bool Worker::getStatus()
{
    bool isGood;

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

    return isGood;
}

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

另外,不能将getStatus函数作为插槽启动,因为只有当控件返回到工作线程事件循环时才会执行它,但是如果您有“无限”的doHeavyJob函数,它永远不会发生。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28484149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档