本文整理汇总了C++中qi::Promise类的典型用法代码示例。如果您正苦于以下问题:C++ Promise类的具体用法?C++ Promise怎么用?C++ Promise使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Promise类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: onEventConnected
static void onEventConnected(RemoteObject* ro, qi::Future<SignalLink> fut, qi::Promise<SignalLink> prom, SignalLink id) {
if (fut.hasError()) {
prom.setError(fut.error());
return;
}
prom.setValue(id);
}
示例2: onSocketDisconnected
void ServiceDirectoryClient::onSDEventConnected(qi::Future<SignalLink> future,
qi::Promise<void> promise, bool isAdd)
{
if (promise.future().isFinished()) {
return;
}
if (future.hasError())
{
qi::Future<void> fdc = onSocketDisconnected(future.error());
fdc.connect(&qi::Promise<void>::setError, promise, future.error());
return;
}
bool ready = false;
{
boost::mutex::scoped_lock lock(_mutex);
if (isAdd)
_addSignalLink = future.value();
else
_removeSignalLink = future.value();
ready = _addSignalLink && _removeSignalLink;
}
if (ready)
{
promise.setValue(0);
connected();
}
}
示例3: serviceReady
void serviceReady(qi::Future<void> fut, qi::Promise<unsigned int> result, unsigned int idx) {
if (fut.hasError()) {
result.setError(fut.error());
return;
}
result.setValue(idx);
}
示例4: call_from_java_cont
static void call_from_java_cont(qi::Future<qi::AnyReference> ret,
qi::Promise<qi::AnyValue> promise)
{
if (ret.hasError())
promise.setError(ret.error());
else
promise.setValue(qi::AnyValue(ret.value(), false, true));
}
示例5: onMetaObject
void RemoteObject::onMetaObject(qi::Future<qi::MetaObject> fut, qi::Promise<void> prom) {
if (fut.hasError()) {
qiLogVerbose() << "MetaObject error: " << fut.error();
prom.setError(fut.error());
return;
}
qiLogVerbose() << "Fetched metaobject";
setMetaObject(fut.value());
prom.setValue(0);
}
示例6: slowDisconnect
void slowDisconnect(qi::Promise<void> ready, qi::Promise<void> done, qi::Future<void> wait, qi::AnyObject obj, boost::shared_ptr<qi::SignalLink> link)
{
ready.setValue(0);
wait.wait();
try {
obj.disconnect(*link);
}
catch (...) {}
done.setValue(0);
}
示例7: onFutureFinished
void ObjectRegistrar::onFutureFinished(qi::Future<unsigned int> fut, long id, qi::Promise<unsigned int> result)
{
if (fut.hasError()) {
result.setError(fut.error());
return;
}
qi::ServiceInfo si;
RegisterServiceMap::iterator it;
{
boost::mutex::scoped_lock sl(_registerServiceRequestMutex);
it = _registerServiceRequest.find(id);
if (it != _registerServiceRequest.end())
si = it->second.second;
if (fut.hasError()) {
_registerServiceRequest.erase(id);
result.setError(fut.error());
return;
}
}
unsigned int idx = fut.value();
si.setServiceId(idx);
{
boost::mutex::scoped_lock sl(_servicesMutex);
BoundService bs;
bs.id = idx;
bs.object = it->second.first;
bs.serviceInfo = si;
bs.name = si.name();
BoundServiceMap::iterator it;
it = _services.find(idx);
if (it != _services.end()) {
qiLogError() << "A service is already registered with that id:" << idx;
result.setError("Service already registered.");
return;
}
_services[idx] = bs;
//todo register the object on the server (find a better way)
Server::addObject(idx, bs.object);
}
{
boost::mutex::scoped_lock sl(_serviceNameToIndexMutex);
_serviceNameToIndex[si.name()] = idx;
}
{
boost::mutex::scoped_lock sl(_registerServiceRequestMutex);
_registerServiceRequest.erase(it);
}
// ack the Service directory to tell that we are ready
qi::Future<void> fut2 = _sdClient->serviceReady(idx);
fut2.connect(boost::bind(&serviceReady, _1, result, idx));
}
示例8: listenStandaloneCont
void SessionPrivate::listenStandaloneCont(qi::Promise<void> p, qi::Future<void> f)
{
if (f.hasError())
p.setError(f.error());
else
{
_sdClient.setServiceDirectory(boost::static_pointer_cast<ServiceBoundObject>(_sd._serviceBoundObject)->object());
// _sdClient will trigger its connected, which will trigger our connected
p.setValue(0);
}
}
示例9: onServiceTrackingCancelled
void SessionPrivate::onServiceTrackingCancelled(qi::Promise<void> promise,
boost::shared_ptr<qi::Atomic<int> > link)
{
SignalLink link2 = link->swap(0);
if (link2 == 0)
return;
_sdClient.serviceAdded.disconnect(link2);
promise.setCanceled();
}
示例10: f
int f(int end, qi::Promise<void> finished)
{
int startval = prop.get();
EXPECT_FALSE(calling);
calling = true;
qi::os::msleep(5);
EXPECT_TRUE(calling);
calling = false;
EXPECT_EQ(startval, prop.get());
if (++callcount == end + 1)
finished.setValue(0);
return 42;
}
示例11: addSdSocketToCache
void SessionPrivate::addSdSocketToCache(Future<void> f, const qi::Url& url,
qi::Promise<void> p)
{
qiLogDebug() << "addSocketToCache processing";
if (f.hasError())
{
qiLogDebug() << "addSdSocketToCache: connect reported failure";
_serviceHandler.removeService("ServiceDirectory");
p.setError(f.error());
return;
}
// Allow the SD process to use the existing socket to talk to our services
_serverObject.registerSocket(_sdClient.socket());
/* Allow reusing the SD socket for communicating with services.
* To do this, we must add it to our socket cache, and for this we need
* to know the sd machineId
*/
std::string mid;
try
{
mid = _sdClient.machineId();
}
catch (const std::exception& e)
{ // Provide a nice message for backward compatibility
qiLogVerbose() << e.what();
qiLogWarning() << "Failed to obtain machineId, connection to service directory will not be reused for other services.";
p.setValue(0);
return;
}
TransportSocketPtr s = _sdClient.socket();
qiLogVerbose() << "Inserting sd to cache for " << mid <<" " << url.str() << std::endl;
_socketsCache.insert(mid, s->remoteEndpoint(), s);
p.setValue(0);
}
示例12: onTrackedServiceAdded
void SessionPrivate::onTrackedServiceAdded(const std::string& actual,
const std::string& expected,
qi::Promise<void> promise,
boost::shared_ptr<qi::Atomic<int> > link)
{
if (actual != expected)
return;
// only do it once in case of multiple calls
SignalLink link2 = link->swap(0);
if (link2 == 0)
return;
_sdClient.serviceAdded.disconnect(link2);
promise.setValue(0);
}
示例13: TEST
TEST(Test, Recurse)
{
payload = qi::Promise<bool>();
TestSessionPair p1;
TestSessionPair p2(p1);
qi::DynamicObjectBuilder ob1, ob2;
ob1.advertiseMethod("onFire1", &onFire1);
ob2.advertiseMethod("onFire2", &onFire2);
qi::AnyObject oserver1(ob1.object()), oserver2(ob2.object());
unsigned int nbServices = TestMode::getTestMode() == TestMode::Mode_Nightmare ? 2 : 1;
// Two objects with a fire event and a onFire method.
ASSERT_NO_THROW(p1.server()->registerService("coin1", oserver1).hasValue(2000));
ASSERT_NO_THROW(p2.server()->registerService("coin2", oserver2).hasValue(2000));
EXPECT_EQ(nbServices, p1.server()->services(qi::Session::ServiceLocality_Local).value().size());
EXPECT_EQ(nbServices, p2.server()->services(qi::Session::ServiceLocality_Local).value().size());
oclient1 = p2.client()->service("coin1");
oclient2 = p1.client()->service("coin2");
#ifdef WIN32
int niter = 1000;
#else
int niter = 1000;
#endif
if (TestMode::getTestMode() == TestMode::Mode_SSL)
{
niter /= 100;
}
if (getenv("VALGRIND"))
{
std::cerr << "Valgrind detected, reducing iteration count" << std::endl;
niter = 50;
}
oclient1.call<void>("onFire1", niter);
ASSERT_NO_THROW(payload.future().hasValue(2000));
oclient1.reset();
oclient2.reset();
}
示例14: producer
void producer(qi::Promise<int> pro) {
qi::os::msleep(100);
pro.setValue(42);
}
示例15: unlock
void unlock(qi::Promise<int> prom, bool* tag)
{
*tag = true;
prom.setValue(1);
}