使用线程处理信号和插槽
Process Signals & Slots Using a Thread
我需要能够发出请求GET请求,这需要使用信号来处理回复,并以处理过的形式返回回复。我已经按照Threading Wihtout the Headache中的描述构建了代码,但当我运行时,从未收到或处理过回复。
// Set-up request
QNetworkAccessManager* pConnection(new QNetworkAccessManager());
connect(pConnection,
SIGNAL(finished(QNetworkReply*)),
this,
SLOT(process(QNetworkReply*)));
QUrl url;
url.setUrl(HOST);
url.addQueryItem("P1", "Hi");
url.addQueryItem("P2", "Bob");
// Send request
QNetworkRequest request(url);
pConnection->get(request);
// Wait for reply
QThread* pResponce(new QThread(this));
connect(this,
SIGNAL(processingFinished()),
pResponce,
SLOT(quit()));
pConnection->moveToThread(pResponce);
pResponce->start();
pResponce->wait();
pConnection->deleteLater();
pResponce->deleteLater();
return this->processedReply;
很明显我错过了什么,但是什么?当我不使用线程(和删除)时,它可以工作,所以它不是URL或服务器。
如果不在其他线程中设置事件循环,则只有主/gui线程接收信号。
如果没有事件循环正在运行,则不会将事件传递到对象。例如,如果在线程中创建一个QTimer对象,但从不调用exec(),则QTimer将永远不会发出其timeout()信号。调用deleteLater()也不起作用。(这些限制也适用于主线程。)
来源:http://doc.qt.digia.com/4.6/threads-qobject.html
参见QThread::exec()
这就是为什么在您链接的示例中引入并使用了QThreadEx类(但不是在您的代码snipplet中!)
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- QObject::连接无法将信号连接到*this*对象的插槽
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- C++Qt信号和插槽
- Qt moveToThread,带有参数的信号/插槽
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 从 QWidgetList 访问 QWidget 子插槽/信号 (QList<QWidget*>)
- 两个对象QT之间的示例插槽/信号
- QT对象::连接:没有此类插槽信号到线程插槽
- Qt QAxWidget - WebBrowser手动设置插槽/信号
- 没有这样的插槽/信号(Qt)