Я хочу создать программу на С++, которая запускает цикл while
в течение определенного времени, а затем выходит из цикла.
Когда цикл делает что-то во время работы, и когда наступает установленное время, он выходит из цикла. Например, пока цикл работает, он будет продолжать печатать материал на экране, а по прошествии 1 минуты он выйдет из цикла.
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
time_t now = time(nullptr);
tm* current_time = localtime(&now);
int current_minute = current_time->tm_min;
int defined_minute = current_minute + 1;
while (current_minute < defined_minute)
{
current_minute = current_time->tm_min;
}
}
Я создал этот код, и он должен был работать, но это не так, я пытался отладить, но до сих пор не понимаю, почему он не работает.
P.S. это мой первый раз, когда я публикую проблему программирования в Интернете, буду признателен, если кто-нибудь подскажет мне, как лучше решать мои проблемы в будущем.
Что вы подразумеваете под "это не работает"?
Ваш цикл не имеет смысла. Ни одна из задействованных переменных не меняет своего значения в цикле, поэтому условие цикла является постоянным (всегда истинным).
Вам нужно обновить now
и current_time
внутри цикла while. Если бы вы ввели какие-то журналы, вы бы увидели, что они никогда не меняются.
под "это не работает" я имею в виду, что цикл будет бесконечным
Дейв, я ввел журнал и увидел, что он никогда не меняется, и вот тут я запутался, но я думаю, что переменная «current_minute» внутри цикла должна была измениться.
спасибо ребята за быстрые ответы кстати
Даже если вы исправили его для обновления now
и current_time
на каждой итерации, у вас будут серьезные проблемы, если вы запустите программу в 10:59:00, и, вероятно, она не будет делать то, что вы ожидаете, если вы запустите ее в 10:32: 58.
Даниэль, я знаю о вещах, которые вы упомянули, что касается запуска программы в 10:59, я думаю о создании некоторого условия, которое помогло бы мне решить эту проблему.
Используйте #include <chrono>
auto t0 = std::chrono::system_clock::now();
while ( (std::chrono::system_clock::now()-t0) < std::chrono::minutes{1})
{
// do stuff
}
Я запустил код, но он немедленно выходит из цикла. Не знаю почему, я никогда не использовал библиотеку <chrono>, я немного покопаюсь, чтобы попытаться понять ее. Спасибо
Вероятно, он не работает, потому что в большинстве систем он будет ждать только до тех пор, пока не пройдет не менее 60 наносекунд. Я бы отбросил count()
и сравнил разницу с std::chrono::minutes{1}
.
Этот фрагмент кода нуждается как минимум в C++ 11 и может содержать несколько сложных объектов C++, но вот как я это себе представлял.
#include <iostream>
#include <future> //std::async
#include <atomic>
#include <chrono>
#include <sstream>
int main()
{
int i = 0;
std::stringstream sstr;
std::atomic<bool> do_it(true);
//store future so that async returns immediately
//see Notes paragraph on https://en.cppreference.com/w/cpp/thread/async
auto fut = std::async(std::launch::async, [&do_it]() {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
do_it = false;
});
//Preemtion could steal some time here...
while ( do_it )
{
sstr << "Iteration: " << ++i << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
std::cout << sstr.str() << "\n" << std::flush;
std::cout << "Bye\n" << std::flush;
}
Результат (вы можете попробовать его на онлайн-компиляторе С++, например колиру)
Iteration: 1
...
Iteration: 95
Iteration: 96
Iteration: 97
Iteration: 98
Bye
Надеюсь, поможет
Вот самый простой ответ:
#include <chrono>
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
auto finish = system_clock::now() + 1min;
do
{
cout << "stuff\n";
} while (system_clock::now() < finish);
}
Для этого требуется C++14 или C++17. Если вы используете C++11, замените minutes{1}
на 1min
. Если вы используете C++03, <chrono>
недоступен, и вам придется использовать C API для синхронизации, что значительно сложнее в использовании.
Вот видеоурок по <chrono>
.
Спасибо, Говард, очень ценю вашу помощь. Я взглянул на ссылку на учебник, которую вы мне дали, это 1-часовое видео, я посмотрю его позже, и я в восторге от этой библиотеки.
Я запустил код, и он работал прекрасно, именно так, как я хотел. Спасибо большое
Привет, Говард, я провел все перед своим ноутбуком (вчера тоже), пытаясь найти способ загрузить файл из Dropbox (или любого другого облачного хранилища) с помощью С++, но безуспешно. Я разместил вопрос здесь, но никто еще не ответил мне, что полностью решило мою проблему. Именно так я нашел способ связаться с вами. Надеюсь, это не неуместно, если это так, я сожалею. если вы можете мне помочь, я был бы признателен. Спасибо
Я не эксперт в этой области, однако по этой ссылке у меня есть код, который использует curl
для загрузки файла с веб-сайта: github.com/HowardHinnant/date/blob/master/src/… Альтернативы curl
включают boost::asio
и boost::beast
(это слой поверх boost::asio
).
из того, что я мог понять, вы используете библиотеку boost, поскольку я считаю себя все еще новичком в С++, я предпочитаю пока не начинать использовать библиотеку lis, я хочу создать более прочную основу/основу, прежде чем идти, я очень ценю, что вы нашли время, чтобы ответить мне на этом Говарде
Я научился использовать библиотеку curl, но я хочу создать программу, которая загружается из Dropbox (поскольку я могу контролировать то, что загружается. Я продолжу поиск Еще раз, спасибо
Другим ответом может быть использование условной переменной, чтобы справиться с уродливой спать_для(...), часто используемой, как в моем первом ответе, что приводит только к 98 итерациям вместо 100 из-за времени, затрачиваемого приложением/вычислениями (здесь печатается некоторый номер цикла внутри строковый поток).
Переменные условия могут быть нацелены более чем на 1 поток
#include <iostream>
#include <thread>
#include <condition_variable>
#include <atomic>
#include <chrono>
#include <sstream>
//From https://en.cppreference.com/w/cpp/thread/condition_variable/wait_until
int index[2] = { 0 };
std::stringstream sstr;
std::condition_variable cv;
std::mutex cv_m;
std::atomic<bool> do_it(true);
std::mutex mut_print;
void foo(char id, int * index)
{
if ( ! index ) return;
auto new_tp = std::chrono::system_clock::now();
while ( do_it )
{
{
std::lock_guard<std::mutex> lock(mut_print);
sstr << "Iteration of "<< id << ": " << ++(*index) << "\n";
}
new_tp += std::chrono::milliseconds(10);
while ( do_it )
{
std::unique_lock<std::mutex> lk(cv_m);
if (std::cv_status::timeout == cv.wait_until(lk,new_tp ) ) {
break;
}
}
}
}
void signals()
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
do_it = false;
cv.notify_all();
}
int main()
{
std::thread t1(foo,'A',&index[0]),t2(foo,'B',&index[1]),ts(signals);
t1.join();
t2.join();
ts.join();
std::cout << sstr.str() << "\n" << std::flush;
std::cout << "Bye\n" << std::flush;
}
Результат
Iteration of A: 1
Iteration of B: 1
Iteration of A: 2
Iteration of B: 2
...
Iteration of A: 100
Iteration of B: 100
Iteration of A: 101
Iteration of B: 101
Bye
На этот раз мы зашли слишком далеко со 101 итерацией, но этот пример не претендует на выполнение ограниченного/заданного количества раз.
Поскольку я никогда не пользовался такими библиотеками, как <thread>, <condition_variable> и <atomic>, этот код для меня немного неудобен. Я проведу небольшое исследование этих библиотек и пойму это. Спасибо.