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

Я хочу создать программу на С++, которая запускает цикл 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. это мой первый раз, когда я публикую проблему программирования в Интернете, буду признателен, если кто-нибудь подскажет мне, как лучше решать мои проблемы в будущем.

Что вы подразумеваете под "это не работает"?

Code-Apprentice 10.04.2019 23:06

Ваш цикл не имеет смысла. Ни одна из задействованных переменных не меняет своего значения в цикле, поэтому условие цикла является постоянным (всегда истинным).

melpomene 10.04.2019 23:06

Вам нужно обновить now и current_time внутри цикла while. Если бы вы ввели какие-то журналы, вы бы увидели, что они никогда не меняются.

Dave S 10.04.2019 23:22

под "это не работает" я имею в виду, что цикл будет бесконечным

HBatalha 11.04.2019 00:00

Дейв, я ввел журнал и увидел, что он никогда не меняется, и вот тут я запутался, но я думаю, что переменная «current_minute» внутри цикла должна была измениться.

HBatalha 11.04.2019 00:03

спасибо ребята за быстрые ответы кстати

HBatalha 11.04.2019 00:09

Даже если вы исправили его для обновления now и current_time на каждой итерации, у вас будут серьезные проблемы, если вы запустите программу в 10:59:00, и, вероятно, она не будет делать то, что вы ожидаете, если вы запустите ее в 10:32: 58.

Daniel Schepler 11.04.2019 01:29

Даниэль, я знаю о вещах, которые вы упомянули, что касается запуска программы в 10:59, я думаю о создании некоторого условия, которое помогло бы мне решить эту проблему.

HBatalha 11.04.2019 11:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
9
1 295
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте #include <chrono>

auto t0 = std::chrono::system_clock::now();
while ( (std::chrono::system_clock::now()-t0) < std::chrono::minutes{1})
{
    // do stuff
}

Я запустил код, но он немедленно выходит из цикла. Не знаю почему, я никогда не использовал библиотеку <chrono>, я немного покопаюсь, чтобы попытаться понять ее. Спасибо

HBatalha 11.04.2019 00:11

Вероятно, он не работает, потому что в большинстве систем он будет ждать только до тех пор, пока не пройдет не менее 60 наносекунд. Я бы отбросил count() и сравнил разницу с std::chrono::minutes{1}.

Daniel Schepler 11.04.2019 01:30

Этот фрагмент кода нуждается как минимум в 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-часовое видео, я посмотрю его позже, и я в восторге от этой библиотеки.

HBatalha 11.04.2019 11:28

Я запустил код, и он работал прекрасно, именно так, как я хотел. Спасибо большое

HBatalha 11.04.2019 23:50

Привет, Говард, я провел все перед своим ноутбуком (вчера тоже), пытаясь найти способ загрузить файл из Dropbox (или любого другого облачного хранилища) с помощью С++, но безуспешно. Я разместил вопрос здесь, но никто еще не ответил мне, что полностью решило мою проблему. Именно так я нашел способ связаться с вами. Надеюсь, это не неуместно, если это так, я сожалею. если вы можете мне помочь, я был бы признателен. Спасибо

HBatalha 20.04.2019 22:16

Я не эксперт в этой области, однако по этой ссылке у меня есть код, который использует curl для загрузки файла с веб-сайта: github.com/HowardHinnant/date/blob/master/src/… Альтернативы curl включают boost::asio и boost::beast (это слой поверх boost::asio).

Howard Hinnant 21.04.2019 02:38

из того, что я мог понять, вы используете библиотеку boost, поскольку я считаю себя все еще новичком в С++, я предпочитаю пока не начинать использовать библиотеку lis, я хочу создать более прочную основу/основу, прежде чем идти, я очень ценю, что вы нашли время, чтобы ответить мне на этом Говарде

HBatalha 21.04.2019 14:08

Я научился использовать библиотеку curl, но я хочу создать программу, которая загружается из Dropbox (поскольку я могу контролировать то, что загружается. Я продолжу поиск Еще раз, спасибо

HBatalha 21.04.2019 14:30

Другим ответом может быть использование условной переменной, чтобы справиться с уродливой спать_для(...), часто используемой, как в моем первом ответе, что приводит только к 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>, этот код для меня немного неудобен. Я проведу небольшое исследование этих библиотек и пойму это. Спасибо.

HBatalha 11.04.2019 23:56

Другие вопросы по теме