0

我总是在我的所有应用程序中使用 QObject::connect() 但是当我的程序当前位于函数内部时,我不清楚它的效果。假设我有以下代码:

void main() {
    //other stuffs here
    QObject::connect(xxx,SIGNAL(yyy()),this,SLOT(zzz());
}

void aFunction()
{
    //a bunch of codes here

    //i am here when suddenly signal is emitted from QObject::connect();

    //another bunch of codes here
}

我假设当信号发出时,QObject::connect 离开函数“aFunction()”来执行“zzz()”。“aFunction()”中剩余的代码会发生什么

谢谢。

4

1 回答 1

0

我可以理解这种困惑,从基于程序的编程到基于事件的编程给了我和你现在一样的体验。

简短回答:在非多线程环境中,插槽zzz()将在aFunction()完成后执行。事实上,信号可能会在 aFunction 完成后发出。在多线程环境中,同样的事情,但它是“一段时间后”,而不是之后。

理解这一点的关键是事件循环。QApplication::exec()运行一个永远循环轮询事件。然后处理新事件,发出信号,并根据QObject::connect其中的第五个参数 a Qt::ConnectionType,最终运行连接的插槽。您可以阅读QObject 文档以获取更多详细信息。

所以你aFunction可能会在某个信号之后被调用,所以在它完成后,它再次回到事件循环,然后你的“突然发出”信号实际上被发出并被zzz执行。

即使在多线程环境中,线程间信号和插槽也可以使用Qt::QueuedConnection,基本上只是将发出的信号发布到相应的线程,以便当该线程的事件循环来处理它时 - 它也将按顺序执行。

最终你必须记住的是,这个被称为计算机的图灵机正在执行代码序列,无论是半并行(例如分时、流水线)还是真正并行(例如多核、多 CPU)的代码被发送的部分(或分布式?或提取?)对其执行将始终按顺序运行,或者必须以一种或多种方式模拟为顺序运行,以便在多个执行节点中不会执行两次代码。

没有“突然”

于 2012-07-22T10:06:12.993 回答