Выполняйте цикл, пока системное время не достигнет определенной даты / времени

0

Мне нужно выполнить простой цикл до тех пор, пока не будет достигнута конкретная дата и время до второго. Это будет основано на системном времени 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";
  • 1
    Это похоже на проблему XY . Пожалуйста, укажите, чего вы пытаетесь достичь.
  • 1
    Пожалуйста, покажите нам, что вы пытались. Общая стратегия состояла бы в том, чтобы проверить системное время внутри цикла и отключить его в установленное время.
Теги:
boost

2 ответа

2
Лучший ответ

Это можно легко сделать с помощью библиотеки 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);
}
  • 0
    Затем он может заполнить структуру time_t и построить из нее end_time ( std::chrono::system_clock::from_time_t )
  • 0
    Смотрите здесь для примера: stackoverflow.com/a/12844843/2176127
Показать ещё 12 комментариев
0

Просто идея, выходящая за пределы вашего вопроса.

Если вам не нужна безумная точность, вы можете проверить время на каждую 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;
  }
}
  • 0
    Мне нужна быстрая точность с точностью до секунды, однако в приложении .NET, которое я портирую на C ++, я использую код, подобный этому, чтобы сообщать время, оставшееся до запуска каждого n-го взаимодействия, поскольку взаимодействие с интерфейсом GUI требует ресурсов.
  • 0
    @ user246181, в зависимости от функции, итерация может занять даже несколько сотен микросекунд, поэтому, если вам требуется до секунды, каждая 1000 или 100 итераций для проверки должны быть в порядке. Если функция действительно не занимает много времени (операции ввода-вывода, графический интерфейс и т. Д.). Вы должны сравнить с разными значениями для n.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню