我使用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个插槽功能连接到finished(QNetworkReply*)
的信号manager
。在这种情况下,当发出finished(QNetworkReply*)
时,将调用此10个槽函数将此回复添加到向量10次。我想如果一个线程已经处理了该函数,那么9个线程的其余部分将丢弃此信号以等待发出另一个信号。有没有办法在第一个插槽中吃finished(QNetworkReply*)
?
答案 0 :(得分:1)
如果我正确理解你在说什么,你就有10个插槽(10个插槽中每个插槽一个)连接到一个信号。并且你只希望其中一个在每个发射上运行。
这不是Qt信号的工作方式。每次发射信号时,Qt信号都会触发连接到信号的每个插槽。您需要更多的消息队列,工作人员可以在队列中等待。
您可能希望查看QWaitCondition example - 等待条件是您可以实现让员工等待某事做的一种方式。
答案 1 :(得分:1)
http://en.wikipedia.org/wiki/Thread_pool_pattern
我认为您正在寻找的是一个处理请求的线程池。一群工人等着做同样的事情,一旦有请求处理它。
http://qt-project.org/doc/qt-5/qthreadpool.html#details
QThreadPool
类管理QThread
的集合。
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
希望有所帮助。