有没有办法在 Qt 中“吃掉”信号?

Posted

技术标签:

【中文标题】有没有办法在 Qt 中“吃掉”信号?【英文标题】:is there a method to `eat` the signal in Qt? 【发布时间】:2014-03-09 02:18:18 【问题描述】:

我使用for循环向http://www.example.com发送请求:

    for(int i = 0; i < size; ++i)
    
        request.setUrl("http://www.example.com");

        manager.get(request);
    

我想并行处理回复,所以我运行了 10 个线程,每个线程都有一个槽函数来将回复添加到Qvector&lt;QNetworkReply*&gt;。我将这个 10 槽函数连接到 manager 的信号 finished(QNetworkReply*)。在这种情况下,当finished(QNetworkReply*) 发出时,这10 个槽函数将被调用以将此回复添加到向量中10 次。我想如果一个线程已经处理了这个函数,其余的 9 个线程放弃这个信号以等待另一个信号发出。有没有办法吃掉第一个插槽中的finished(QNetworkReply*)

【问题讨论】:

目前,您的要求有些不清楚和奇怪。您能否提供更多代码来代表您正在尝试做的事情? 【参考方案1】:

http://en.wikipedia.org/wiki/Thread_pool_pattern

我认为您正在寻找的是一个线程池来处理请求。一群等待做同样事情的工人,一旦有请求就处理它。

http://qt-project.org/doc/qt-5/qthreadpool.html#details

QThreadPool 类管理QThreads 的集合。

QThreadPool 管理和回收单个 QThread 对象以帮助减少线程 使用线程的程序的创建成本。每个 Qt 应用程序都有 一个全局QThreadPool对象,可以通过调用来访问 globalInstance().

要使用QThreadPool 线程之一,子类QRunnable 和 实现run() 虚函数。然后创建一个对象 类并将其传递给QThreadPool::start()

https://www.google.com/search?q=qthreadpool+network

http://www.bogotobogo.com/Qt/Qt5_QTcpServer_QThreadPool_Multithreaded_Client_Server.php

希望对您有所帮助。

【讨论】:

【参考方案2】:

如果我正确理解您的意思,您有 10 个插槽(10 个线程中的每个线程)连接到一个信号。并且您只希望其中一个在每次发射时运行。

这不是 Qt 信号的工作方式。每次发出信号时,Qt 信号都会触发连接到该信号的每个插槽。你想要更多的消息队列,可以让工作人员在队列中等待。

您可能想查看 QWaitCondition example - 等待条件是您可以实现让工作人员等待某事做的一种方式。

【讨论】:

以上是关于有没有办法在 Qt 中“吃掉”信号?的主要内容,如果未能解决你的问题,请参考以下文章

未调用 Qt 信号槽

如何在 Qt 信号中使用对抽象类的引用?

Qt:将信号/绑定参数适应插槽?

QT4 设计器在信号/槽编辑器中不接受“&”引用和“”空格字符

QT中QLineEdit的editingFinished()信号在按下回车时会触发两次的解决办法

QTableView 没有行区的信号