Benim mainthread, arka plan iş parçamı (şebeke hizmeti) çağıran bir Qt penceresi var ve sonuçta yanıtlanması gereken yanıtları bekliyorum.Ana UI iş parçacığındaki lambda/std :: işlevinin çağrılması bir arka plan iş parçacığından çağrılıyor
std::function<void(std::shared_ptr<message>)> delegate_;
void NetworkService::request(message& msg,std::function<void(std::shared_ptr<message> msg)> fn)
{
// send the request to the socket and store the callback for later
// ...
this->delegate_ = fn;
}
void NetworkService::onResponseReceived(std::shared_ptr<message> responseMsg)
{
// is called from the background thread (service)
// Here I would like to call the lambda function that the service stored somewhere (currently as an std::func member)
// psuedo: call In Main Thread: delegate_(responseMsg);
}
Nasıl işliyor: UI şu şekildedir:
// runs in main (GUI) thread
void QTServer::onButtonClick(){
srv->request(msg,
[this]
(std::shared_ptr<message> msg){
this->ui.txtResponse->setText("received a response" + msg.data());
});
}
şebeke hizmetidir? Çalışıyor mu?
Sana mainthread bir işlevi çağırmak içinQMetaObject::invokeMethod(this, "method", Qt::QueuedConnection
kullanabileceğinizi biliyor, bu yüzden aşağıdaki çalıştı:
void NetworkService::onResponseReceived(std::shared_ptr<message> responseMsg)
{
QMetaObject::invokeMethod(this, "runInMainThread", Qt::QueuedConnection, QGenericArgument(), Q_ARG(std::function<void(std::shared_ptr<message>)>, delegate_));
}
nasıl _delegate için bir argüman olarak burada responseMsg geçmek?
void QTServer::runInMainThread(std::function<void(std::shared_ptr<message>)> f) {
f();
}
"Bu argümanlar ile işlev yok" hatası nasıl alınır?
Sonra reinterpret_cast kullanın Q_ART (void *, delegate_) ' – netik
geçişli adresi Q_ARG (void *, & delegate_)' çalışırsanız hmm, bu "hayır yapıcı mevcut" diyor) *> –
jonezq