C ++ запускает асинхронную функцию каждую секунду - PullRequest
0 голосов
/ 21 ноября 2018

Я занимаюсь разработкой приложения на C ++ с использованием Qt, и мне нужно каждую секунду асинхронно запускать функцию.

Приложение работает следующим образом:

  • пользователь запускает функцию allityity;
  • приложение вызывает конкретную функцию асинхронно, позволяя пользователю делать что-то еще в это время;
  • когда пользователь останавливает функцию, приложение перестает вызывать функцию.

Для других функций я использовал интегрированные в Qt SLOTS и SIGNALS, например:

connect(timer, SIGNAL(timeout()), this, SLOT(updateView()));
timer->start(200);

, но для этой конкретной функции я хотел использовать только функциональность C ++, такую ​​как thread, mutex, future, обещание и asynch .

Я пробовал что-то вроде этого:

if(cmd == start) {
    std::future<void> fn = async(std::launch::async, [](){
    // some code here
 });
}

Таким образом, каждый раз, когда пользователь нажимает start , приложение вызывает функцию lambda.

Теперь я хочу, чтобы эта функция вызывалась каждую секунду, пока пользователь не нажмет stop , не побуждая его сделать что-то еще в это время.

Может кто-нибудь Помогите мне?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

В одну сторону ist std::thread.Используется для запуска другой функции асинхронно.После запуска он завершается после возврата из функции, которую вы ему дали, поэтому вы должны использовать цикл для управления им.

Чтобы предотвратить условия гонки, я обычно использую переменную std::atomic для управления этим циклом.

Если объект потока можно вызывать из нескольких параллельных потоков, вы должны защитить его мьютексом для предотвращения множественного параллельного доступа.

Один из примеров реализации может выглядеть следующим образом:

class MyParallelJob
{
private:
    std::thread* _thread = nullptr;
    std::atomic<bool> _threadRunning = false;

public:
    void startThread()
    {
        if(_thread == nullptr) // This condition prevents the thread from being started twice.
        {
            _threadRunning = true; // Set thread loop condition to true
            _thread = new std::thread(parallel, this); // Create thread
        }
    }

    void stopThread()
    {
        if(_thread != nullptr) // Prevents from stopping an stopped thread
        {
            _threadRunning = false; // Set thread loop condition to false
            _thread.join(); // Wait for thread to finish
            delete _thread; // Delete thread
            _thread = nullptr; // Set thread pointer to nullptr
        }
    }

    void parallel() // Function valled by thread
    {
        while(_threadRunning == true) // While thread loop condition variable is true(=> stopThread() not called)...
        {
            //Asynchronous jobs here. (eg. function call)
            sleep(1); // Sleep one second
        }

    }
}
0 голосов
/ 21 ноября 2018

Используя std::future, предположим, что ваш код выполнен один раз, и вы получите некоторый результат в будущем.Так что это не ваш случай.Таймер, который вы ищете, может быть реализован как отдельный поток с бесконечным циклом, который периодически вызывает ваш функтор.Пожалуйста, посмотрите на это решение: https://stackoverflow.com/a/30425945/149818

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...