多线程中的Qt代码序列。这可能吗?

时间:2015-11-14 06:57:01

标签: multithreading qt qthread

这是objectA,它是QThread的子类

void run()
{
    while (continue)
        emit query();
}

void work(int input, bool workdone)
{
     // work hard here
     if (workdone) { continue = false; }
}

这是主要对象

中的一些代码
{
    ObjectA A* = new ObjectA(this);
    connect(A, SIGNAL(query()), this, SLOT(handleQuery()));
    objectA.start();
}

void handleQuery()
{
    A.work(interger, allJobDONE);
}

好的,我不知道如何命名这个问题。基本上,它只是“这个代码会起作用吗?”如果是,代码序列怎么样?

让我解释一下我的问题。 ObjectA是一个线程。它将通过发出查询信号不时地查询信息。当主代码对查询信号进行grubbed时,主代码决定是否有作业,以便通过调用work()函数将作业发送到ObjectA。 如果此代码有效,则同一对象中的run()work()函数同时工作。这可能吗?

1 个答案:

答案 0 :(得分:2)

几乎没有问题:

  • 函数ObjectA::run()阻止线程的事件循环;
  • 从错误的线程调用
  • A.work();
  • 需要考虑正确删除A

不要在while中阻止run()循环,而是使用计时器。但是,在这种情况下,应该执行线程事件循环(它在QThread::run()的默认实现中完成。因此,应该使用一些其他成员槽来启动该任务,例如:

void ObjectA::doLoop()
{
    emit query();
    QTimer::singleShot(0, this, SLOT(doLoop()));
}

在线程启动时应该调用该函数,例如可以通过ObjectA构造函数中的连接来完成:

connect(this, SIGNAL(started()), this, SLOT(doLoop()));

更好的做法是让私有指针QTimer*能够从work()停止该计时器或进行其他控制。请注意,在这种情况下,QTimer对象应与ObjectA在同一个线程中。

通常ObjectA::work()函数应由handleQuery()的某些信号触发。 ObjectA的事件循环将捕获该信号,work()将在ObjectA线程中启动。