Мне нужно выполнить простой цикл до тех пор, пока не будет достигнута конкретная дата и время до второго. Это будет основано на системном времени Linux. Я не могу найти образцы онлайн, которые демонстрируют это. Я использую библиотеку boost, поэтому любые идеи, которые будут включать boost, прекрасны. Благодарю.
изменить мой вопрос, как вы сравниваете одну временную структуру с другой, чтобы узнать, какая из них больше?
using namespace std;
using namespace boost::local_time;
stringstream ss;
string strStartTime = "1/5/2014 10:59:59 AM";
local_time_input_facet *input_facet = new local_time_input_facet("%m/%d/%Y %H:%M:%S %p !");
ss.imbue(std::locale(ss.getloc(), input_facet));
local_date_time ldt(not_a_date_time);
string stringDateOnly = EasySplit(strStartTime, " ")[0];
string stringTimeOnly = EasySplit(strStartTime, " ")[1];
string stringMonthOnly = EasySplit(stringDateOnly, "/")[0];
string stringDayOnly = EasySplit(stringDateOnly, "/")[1];
string stringYearOnly = EasySplit(stringDateOnly, "/")[2];
string stringTimeHourOnly = EasySplit(stringTimeOnly, ":")[0];
string stringTimeMinuteOnly = EasySplit(stringTimeOnly, ":")[1];
string stringTimeSecondOnly = EasySplit(EasySplit(stringTimeOnly, ":")[2], " ")[0];
string stringTimeAMPMOnly = EasySplit(EasySplit(stringTimeOnly, ":")[2], " ")[1];
//if(stringMonthOnly.length()==1)
//{
// stringMonthOnly = "0" + stringMonthOnly;
//}
//if(stringDayOnly.length()==1)
//{
// stringDayOnly = "0" + stringDayOnly;
//}
//if(stringTimeHourOnly.length()==1)
//{
// stringTimeHourOnly = "0" + stringTimeHourOnly;
//}
//if(stringTimeMinuteOnly.length()==1)
//{
// stringTimeMinuteOnly = "0" + stringTimeMinuteOnly;
//}
//if(stringTimeSecondOnly.length()==1)
//{
// stringTimeSecondOnly = "0" + stringTimeSecondOnly;
//}
stringDateOnly = stringMonthOnly + "/" + stringDayOnly + "/" + stringYearOnly;
stringTimeOnly = stringTimeHourOnly + ":" + stringTimeMinuteOnly + ":" + stringTimeSecondOnly + " " + stringTimeAMPMOnly;
strStartTime = stringDateOnly + " " + stringTimeOnly;
ss.str(strStartTime);
ss >> ldt;
std::tm btm = {0};
btm.tm_sec = atoi(stringTimeSecondOnly.c_str());
btm.tm_min = atoi(stringTimeMinuteOnly.c_str());
btm.tm_hour = atoi(stringTimeHourOnly.c_str());
btm.tm_mday = atoi(stringDayOnly.c_str());
btm.tm_mon = atoi(stringMonthOnly.c_str());
btm.tm_year = atoi(stringYearOnly.c_str());
btm.tm_isdst = 1;
std::time_t tt = mktime(&btm);
boost::chrono::system_clock::time_point end_time = boost::chrono::system_clock::from_time_t(tt);
while (end_time > boost::chrono::system_clock::now())
{
cout << "Waiting\n";
}
cout << "EXIT\n";
Это можно легко сделать с помощью библиотеки std::chrono
:
// For a timepoint that is relative to now
std::chrono::system_clock::time_point end_time =
std::chrono::system_clock::now() + std::chrono::milliseconds(500);
// For a certain point in time
std::time_t tt;
std::tm tm = {0};
tm.tm_sec = 0;
tm.tm_min = 9;
tm.tm_hour = 19;
tm.tm_mday = 5;
tm.tm_mon = 1 - 1;
tm.tm_year = 2014 - 1900;
tm.tm_isdst = -1;
tt = mktime(&tm);
std::chrono::system_clock::time_point end_time =
std::chrono::system_clock::from_time_t(tt);
while (end_time > std::chrono::system_clock::now()) {
foo(bar);
}
time_t
и построить из нее end_time
( std::chrono::system_clock::from_time_t
)
Просто идея, выходящая за пределы вашего вопроса.
Если вам не нужна безумная точность, вы можете проверить время на каждую n-ю итерацию в цикле, а не на каждом из них:
int n = 1000;
int i = 0;
while (true) {
foo(bar);
i++;
if (i >= n) {
if (end_time > std::chrono::system_clock::now()) {
break;
}
i = 0;
}
}