有没有办法在 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<QNetworkReply*>
。我将这个 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
类管理QThread
s 的集合。
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 中“吃掉”信号?的主要内容,如果未能解决你的问题,请参考以下文章
QT4 设计器在信号/槽编辑器中不接受“&”引用和“”空格字符