Я ввел переменную-член std::thread
в своем классе Request, который должен работать с подпрограммой в фоновом режиме.Процедура отправляет запрос, собирает данные и ждет короткое время, прежде чем повторить.После первой итерации процедуры другие переменные-члены объекта класса неожиданно меняются.
Раньше у меня была эта подпрограмма запроса без переменной-члена std :: thread.Когда я добавил переменную-член std :: thread, мне пришлось удалить функции-члены копирования и назначения копирования, потому что потоки не могут быть скопированы.
Даже когда комментирует функцию sendRequest и просто спит, запрособъект модифицируется.Я пробовал разные подходы к определению и инициализации члена класса std :: thread.
class Request {
public:
Request() = default;
Request(/*args*/);
Request(const Request&) = delete;
Request& operator=(const Request&) = delete;
Request(Request&&) = default;
Request& operator=(Request&&) = default;
~Request();
bool active = true;
private:
void start();
void routine();
void sendRequest();
std::thread requestRoutine;
std::chrono::seconds sleepinterval;
//std::queue<std::vector<std::pair<Query, json::value>>> responseQueue;
}
Request::Request(/*args*/)
: requestRoutine()
{
/*init member variables*/
start();
}
void Request::start()
{
requestRoutine = std::thread(&Request::routine, this);
requestRoutine.detach();
}
void Request::routine()
{
while (this->active) {
sendRequest();
std::this_thread::sleep_for(sleepinterval);
}
}
Я сократил класс до важных функций-членов и переменных.Если вам интересно, я использую cpprestsdk для отправки HTTP-запроса и получаю ответ HTTP с объектом JSON в теле.Для этого файла наиболее важны следующие операции:
#pragma once
#include <iostream>
#include <thread>
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/date_time/gregorian/gregorian_types.hpp"
#include <cpprest/http_listener.h>
#include <cpprest/http_client.h>
#include <cpprest/json.h>
#include <cpprest/filestream.h>
Любая помощь и советы приветствуются.
Спасибо!