首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QueuedConnection将两个信号连接在一起

使用QueuedConnection将两个信号连接在一起
EN

Stack Overflow用户
提问于 2012-03-21 03:25:10
回答 2查看 31K关注 0票数 25

Qt 文档指出,可以将两个信号连接在一起:

甚至可以将一个信号直接连接到另一个信号。

我试过:

代码语言:javascript
复制
connect(x, SIGNAL(S()), y, SIGNAL(func()));

正如前面提到的,它可以工作,但是Qt文档继续:

(每当发出第一个信号时,这将立即发出第二个信号。)

这是否意味着QueuedConnection不能正常工作?我可以跨线程连接两个信号吗?

我之所以问这个问题,是因为我通过避免这一点解决了应用程序上的一类崩溃,但我不确定这是否与将信号连接在一起有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 20:26:39

它应该与信号/时隙连接没有太大的不同。让我们看一看信号/插槽的基本机制。每个线程中都有一个事件队列,它维护已经发出但尚未处理的信号(事件)。因此,每当执行返回到事件循环时,队列就会被处理。事件循环本身不处理事件。相反,它将它们传递给对象,以便它们能够处理它。在这种特殊情况下,我假设对象会发出另一个信号,然后插入到队列中。当执行返回到事件循环时,对象将再次处理新的信号。这是一个证明上述论点的测试。

如果运行附加的代码,输出将是:

代码语言:javascript
复制
before signal() 
after signal() 
slot() called

这意味着将信号-信号连接类型定义为线程之间的队列类型,该类型具有预期的排队行为,这拒绝了始终是即时的参数。如果将其定义为直接输出,则输出如下:

代码语言:javascript
复制
before signal()
slot() called 
after signal()

如预期的那样。它不会产生任何错误或警告,程序也不会崩溃,因为well.Yet这个简单的例子不能证明它也适用于大型复杂的程序。

main.cpp:

代码语言:javascript
复制
#include <QtGui/QApplication>
#include "dialog.h"
#include "testssconnection.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    TestSignalSignalConnection * t = new TestSignalSignalConnection();
    t->start();

    return a.exec();
}

H:

代码语言:javascript
复制
#ifndef TESTSSCONNECTION_H
#define TESTSSCONNECTION_H

#include <QObject>
#include <QThread>

class TestSignalSignalConnection : public QThread
{
    Q_OBJECT
public:
    explicit TestSignalSignalConnection(QObject *parent = 0);

    void run();

signals:
    void signal1();
    void signal2();

public slots:
    void slot();
};

#endif // TESTSSCONNECTION_H

testssconnection.cpp:

代码语言:javascript
复制
#include "testssconnection.h"
#include <QtCore>

TestSignalSignalConnection::TestSignalSignalConnection(QObject *parent) :
    QThread(parent)
{
}

void TestSignalSignalConnection::run()
{
    TestSignalSignalConnection *t = new TestSignalSignalConnection();

    this->connect(this,SIGNAL(signal1()),t,SIGNAL(signal2()), Qt::QueuedConnection);
    t->connect(t,SIGNAL(signal2()), t,SLOT(slot()), Qt::DirectConnection);

    qDebug() << "before signal()";
    emit signal1();
    qDebug() << "after signal()";

    exec();
}

void TestSignalSignalConnection::slot()
{
    qDebug() << "slot() called";
}
票数 29
EN

Stack Overflow用户

发布于 2013-03-16 11:41:47

看看qt项目,它是一个很棒的关于线程和信号的wiki页面。

线程、事件和QObjects::线程间的信号和槽

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

https://stackoverflow.com/questions/9798195

复制
相关文章

相似问题

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