Evgenii Legotckoi
Evgenii LegotckoiЖел. 28, 2018, 9:09 Т.Ж.

Boost - boost::thread арқылы мерзімді тапсырмаларды орындау

Предлагаю написать небольшую консольную программу, которая через равные промежутки времени будет выполнять одну задачу.

Например, программа запускается и делает 10 проб в течение 10 секунд, при этом программа будет выводить информацию о количестве обратного отсчета в консоль.

Программа будет работать следующим образом.

Выполнение периодический задачи в консольном приложении


Структура проекта

В проекте используется система сборки CMake, поэтому структура проекта будет следующей.

PeriodicTask project structure

CMakeLists.txt

Вот стандартная конфигурация CMake для сборки проекта.

cmake_minimum_required (VERSION 3.8)

project(Periodic)

set(CMAKE_CXX_STANDARD 17)
set(Boost_USE_STATIC_LIBS ON)

find_package(Boost 1.68 REQUIRED COMPONENTS thread)

set(SOURCE_FILES
        Periodic/main.cpp
        Periodic/PeriodicTask.cpp)

SET(HEADER_FILES
        Periodic/PeriodicTask.h)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(Periodic ${SOURCE_FILES} ${HEADER_FILES})
    target_link_libraries(Periodic ${Boost_LIBRARIES})
endif()

PeriodicTask.h

Заголовочный файл периодической задачи.

В простейшем случае для создания класса периодической задачи нам потребуется:

  • триггерный период
  • объект std::function для хранения задачи
  • переменная bool для остановки и запуска задачи. В данном примере мы не будем останавливать задачу, но если добавить методы run/stop, то реализовать это вполне возможно.
  • boost::thread — поток, без которого этот функционал не может быть реализован
#pragma once

#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <functional>
#include <atomic>

class PeriodicTask
{
public:
    explicit PeriodicTask(const boost::chrono::milliseconds &period, const std::function<void()> &func);

    virtual ~PeriodicTask();

private:
    boost::chrono::milliseconds m_period;   // Task period
    std::function<void()> m_func;           // The function that will perform the periodic task
    std::atomic<bool> m_running;            // A variable that indicates that the task is running, with the help of it you can stop the task in the future
    boost::thread m_thread;                 // Task thread
};

PeriodicTask.cpp

#include "PeriodicTask.h"

PeriodicTask::PeriodicTask(const boost::chrono::milliseconds &period, const std::function<void()> &func) :
    m_period(period),
    m_func(func),
    m_running(true)
{
    // Create a stream object to perform a periodic task.
    m_thread = boost::thread([this]
    {
        while (m_running)
        {
            // To perform a task with a specific period, immerse the stream in a dream after each task execution.
            boost::this_thread::sleep_for(m_period);
            if (m_running)
            {
                // perform the task
                m_func();
            }
        }
    });
}

PeriodicTask::~PeriodicTask()
{
    // When destroying an object with a periodic task
    m_running = false;
    // interrupt the flow, otherwise the program will not release system resources until the flow comes out of sleep
    // this is critical if the trigger period of the task is measured in tens of seconds and more
    m_thread.interrupt();
    m_thread.join();
}

main.cpp

Файл с основной функцией. Когда мы создаем объект периодической задачи, мы помещаем в него лямбда-функцию как задачу, как самый простой способ указать, какую работу нужно выполнить.

#include "PeriodicTask.h" // We connect the class header file to perform periodic tasks.

#include <iostream>

int main(int argc, const char* argv[])
{
    std::cout << "Start program" << std::endl;
    int count = 0;
    // Create a periodic task with a period of 1 second
    PeriodicTask p(boost::chrono::seconds{ 1 }, [&count]() {
        // Display the counter and increment it by one.
        std::cout << count++ << std::endl;
    });

    // Stop the main program flow for 10 seconds so that the periodic task can work 10 times.
    boost::this_thread::sleep_for(boost::chrono::seconds{ 10 });
    std::cout << "End program" << std::endl;
    return 0;
}

Заключение

В заключение прилагаю архив с проектом.

Periodic.zip Periodic.zip

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз