Син c асинхронный c метод по глупости - PullRequest
0 голосов
/ 09 июля 2020

Существует asyn c methodB, который я не могу напрямую заблокировать с помощью get (), поскольку это однопоточное приложение, которое может вызвать взаимоблокировку. (Некоторые детали опущены, чтобы сосредоточиться на реальной проблеме)

Я получаю ошибку компиляции, например: шаблон кандидата проигнорирован: ошибка замены [с F = bool]: нет типа с именем 'type' в 'std :: invoke_result'

У меня 3 проблемы с кодом, перечисленные с комментариями. Любая помощь приветствуется.

#include <utility>
#include <iostream>
#include <folly/Format.h>
#include <folly/futures/Future.h>
#include <folly/executors/ThreadedExecutor.h>
#include <folly/Uri.h>
#include <folly/FBString.h>

using namespace std;



bool methodA() {
  auto promise = std::make_shared<folly::Promise<bool>>();
  addSessionConnectedCallback([=]() {
    promise->setWith(executeActionInThreadPool([=]() { // 1 COMPILATION ERROR
      methodB();
    }));
  });
  blockUntilMatch<bool>(true, [&promise]() { return promise.hasValue(); });
  return true; // 2 Want to return the value from methodB
}

folly::Future<bool> methodB(); // It could return true/false or exception

template <typename Value>
bool blockUntilMatch(
    const Value& expected,
    std::function<Value(void)> fn) {
  auto match = false;
  auto start = std::chrono::system_clock::now();
  while (!match) {
    auto newValue = fn();
    match = newValue == expected;
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    if (std::chrono::system_clock::now() > start + std::chrono::seconds(10)) {
      return false;
    }
  }
  return true;
}

bool executeActionInThreadPool( // has to be sync
    std::function<bool()> action) {
  folly::CPUThreadPoolExecutor executor{1};
  folly::makeFuture()
      .via(executor.weakRef())
      .thenValue([action](auto&&) { action(); }).get();
  return true; // 3 Should be the return value of action()
}

int main()
{
    cout<< methodA();
    return 0;
}
...