#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;
};