我有这个QT相关的问题。 QNetworkAccessManager :: get()返回QNetworkReply指针。然后我可以连接到它的光洁度插槽:qnetworkaccessmanager QNetworkReply - 比赛条件?
QNetworkReply* r = nam->get(url);
connect(r, SIGNAL(finished()),
this, SLOT(_finishedThisReply()));
这似乎做的事情以正确的方式,特别是,使用这种方法,你可以有相同的QNetworkAccessManager对象同时请求。但是,我们在这里没有竞争条件吗?如果在完成获取和呼叫之间连接完成的信号已发送?或者QT保证这不会发生?我在QT文档中找不到任何有关它的信息。
我想QNetworkAccessManager不会使用额外的线程为了不阻止主要的GUI线程。如果我正确理解了你的话,你说QNetworkAccessManager需要将finished()事件发布到主线程上,并且直到在主事件循环中处理完这个请求,我才可以安全地订阅这个信号? – Andre
@Andre是的,发布槽位呼叫与发布信号呼叫之间存在着重要的区别。发布的调用是一个信号,一旦你将控制权返回给事件循环,它就会被你的线程拾取。如果网。经理。发布了一个插槽呼叫(或*发出*信号),然后您的插槽将不会被呼叫,因为在信号发射时您的插槽尚未连接。后一种情况是你担心的比赛。 –
好的,很明显,信号发射(发送到当前连接的插槽)必须通过事件循环中的主线程完成,对吗? – Andre