多线程中的 Qt 代码序列。这可能吗?
Qt code sequence in multithread. Is this possible?
这是对象A,它是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);
}
好的,我不知道如何命名这个问题。基本上就是 "will this code work?" 如果是,代码顺序是怎样的?
让我解释一下我的问题。 ObjectA 是一个线程。它会不时地通过发出查询信号来查询信息。当查询信号被主代码抓取后,主代码判断是否有作业,调用work()
函数将作业发送给ObjectA。
如果此代码有效,则同一对象中的 run()
和 work()
函数会同时工作。这可能吗?
问题很少:
- 函数
ObjectA::run()
阻塞了线程的事件循环;
A.work()
被错误的线程调用;
- 需要考虑适当删除
A
。
与其在 run()
中阻塞 while
循环,不如使用计时器。然而,在那种情况下,应该执行线程事件循环(它在 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
线程中启动。
这是对象A,它是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);
}
好的,我不知道如何命名这个问题。基本上就是 "will this code work?" 如果是,代码顺序是怎样的?
让我解释一下我的问题。 ObjectA 是一个线程。它会不时地通过发出查询信号来查询信息。当查询信号被主代码抓取后,主代码判断是否有作业,调用work()
函数将作业发送给ObjectA。
如果此代码有效,则同一对象中的 run()
和 work()
函数会同时工作。这可能吗?
问题很少:
- 函数
ObjectA::run()
阻塞了线程的事件循环; A.work()
被错误的线程调用;- 需要考虑适当删除
A
。
与其在 run()
中阻塞 while
循环,不如使用计时器。然而,在那种情况下,应该执行线程事件循环(它在 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
线程中启动。