전용 스레드가 있으면 좋습니다. 그러나 여기에 전용 스레드없이 그것을 할 수있는 방법이 있습니다. 그리고이 기술은 전용 스레드와 함께 사용할 수도 있습니다.
결론은 :
이 작업
사용 sleep_until
대신에 대한 sleep_for
를 사용하지 마십시오.
적절한 웨이크 업 시간을 한 번 얻을 수 있습니다. 그리고 루프 중에 수행해야 할 작업을 수행하십시오. 그리고 다음번에 일어날 때까지 (1 초 동안 자고있는 것 대신에) 1 초 이상 깨면 일어나십시오.
위의 설명에서 "sleep until"과 "sleep for"을 유의하십시오. 나는 header-only library "date.h" 그냥 쉽게 현재 UnixTime 타임 스탬프를 포맷 할 수 있도록 추가 한
#include "date.h"
#include <iomanip>
#include <iostream>
#include <random>
#include <thread>
std::mt19937_64 eng;
void
do_other_work()
{
using namespace std;
using namespace std::chrono;
static uniform_int_distribution<> dist{2, 600};
this_thread::sleep_for(milliseconds{dist(eng)});
}
std::pair<double, date::sys_seconds>
get_humidity()
{
using namespace std;
using namespace std::chrono;
using namespace date;
static uniform_real_distribution<> dist;
return {dist(eng), round<seconds>(system_clock::now())};
}
int
main()
{
using namespace std;
using namespace std::chrono;
using namespace date;
cout << fixed << setprecision(2);
auto wakeup = system_clock::now() + 1s;
while (true)
{
auto data = get_humidity();
cout << data.first << " : " << data.second << '\n';
do_other_work();
this_thread::sleep_until(wakeup);
wakeup += 1s;
}
}
:
다음은이 콘크리트를 만들기 위해 코드입니다. 위의 홈 지점은 system_clock::now()
으로 time_point
wakeup
을 한 번 설정 한 다음 각 반복마다 1s
만큼 증가시키고 this_thread::sleep_until
을 사용하여 time_point
이 될 때까지 잠자기합니다. 초당만큼 다른 일이 1 초를 초과하지 않는 한,이 프로그램은 안정적으로 출력 데이터를합니다 일단 :
0.79 : 2017-01-23 02:06:21
0.40 : 2017-01-23 02:06:22
0.02 : 2017-01-23 02:06:23
0.27 : 2017-01-23 02:06:24
0.14 : 2017-01-23 02:06:25
0.86 : 2017-01-23 02:06:26
...
가 다른 스레드에서 get_humidity()
을 넣어하려는 경우, 그것은 여전히 괜찮습니다. 그러나 다른 작업을 수행해야하는 다른 스레드에서 정확한 per/sec 보고서를 유지하려면 sleep_for
대신 sleep_until
을 사용하십시오. 다른 작업에 소요되는 시간을 모르기 때문에이 값을 사용하십시오.
명시 적 스레드가 필요하지 않습니다. 각 읽기 사이에 잠깐 잠을 자면됩니다. std :: time()으로 시간을 얻을 수 있습니다. –
내 코드가 더 길다면 어떨까요?센서에 데이터를 요청하기 전에 200 줄의 코드가 있다고 가정 해 보겠습니다. 1 초간 잠이라면 각 초마다 값을 얻지 못할 것입니다. C에서 종료하는 것과 같이 인터럽트 할 수있는 방법이 있습니까? 따라서 UixTime이 변경 될 때마다 센서에 데이터를 요청하고 데이터베이스에 기록합니다. – JayJay
* NIX에서 작업하는 경우'std :: threads' 또는 좋은 구식 [fork] (https://linux.die.net/man/2/fork)에 대한 반대 의견은 무엇입니까? 그것은 백그라운드에서 일을하는 표준 방법입니다. – Oncaphillis