我在Request类中引入了一个std::thread
成员变量,该变量应该在后台运行一个例程。该例程正在发送请求,收集数据并等待很短的时间再重复。例程的第一次迭代后,类对象的其他成员变量发生意外更改。
在没有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请求,并且我在正文中接收到带有JSON对象的HTTP响应。 此文件最多包含以下内容:
#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>
非常感谢您的帮助和建议。
谢谢!