#include <chrono>
#include <thread>
#include <future>
// …
constexpr uint32_t WAIT_TIME_IN_MS = 250;
// …
void CCRestBridge::internal_operation(TMValString const& targetURL, TMValString const& body, HTTPMethod method_verb, const std::map<std::wstring, std::wstring>& headerParams)
{
  // …
}
 
void CCRestBridge::fetch(HTTPMethod method_verb, TMValString const& targetURL, TMValString const& body, const std::map<std::wstring, std::wstring>& headerParams, WaitTimeCallback* const callback)
{
    long int start_time = NOW.GetJulianMilliseconds();
    clear();
#ifdef _WIN32
    CWaitCursor wait;
#endif
    constexpr auto wait_time = std::chrono::milliseconds(WAIT_TIME_IN_MS);
    auto future = std::async(std::launch::async, &CCRestBridge::internal_operation, this, targetURL, body, method_verb, headerParams);
    while (future.valid())
    {
#ifdef _WIN32
        wait.Restore();
#endif
 
        if (callback != nullptr)
        {
            long int elapsed_time = NOW.GetJulianMilliseconds() - start_time;
            callback->elapsed_time(elapsed_time);
        }
 
        if (future.valid() && future.wait_for(wait_time) == std::future_status::ready)
        {
            future.get();
        }
        else
        {
#ifdef _WIN32
            //TRACE("Pumping events...Wainting for call since: %d ms\n", NOW.GetJulianMilliseconds() - start_time);
            for (MSG msg; ::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_NOREMOVE); )
            {
                AfxPumpMessage();
            }
#endif
        }
    }
}
struct WaitTimeCallback {
     /*<
     * Example usage:
     *   class CCKUNDENPFLEGE_CLASS CCCKundenpflege : public CCCWinApp, public CCChannelCallBack, public CCRestBridge::WaitTimeCallback
     *   ...
     * virtual void elapsed_time(int64_t time_in_ms) override;
     * ...
     * void CCCKundenpflege::elapsed_time(int64_t time_in_ms) {
     *      TMString msg("Warte auf Ergebnis seit ");
     *      msg << to_string(time_in_ms) << " ms";
     *      GetAppView()->SetStatusBarText(ID_INDICATOR_VID , msg);
     * }
     */
     virtual void elapsed_time(int64_t time_in_ms) = 0;
};