Проблема с таймером с++

177
14 декабря 2021, 05:30

Помогите разобраться, стоит задача: нужно по таймеру вызывать функцию в другом потоке Вот что у меня получается

int main() {
// Записываю в файл
File::write("test.txt", "test query");
// Читаю
std::cout(File::read("test.txt", std::chrono::milliseconds(2000)));
return 0;

}

std::string File::read(std::string nameFile, std::chrono::microseconds delay) {
std::thread([=]() {
    std::this_thread::sleep_for(std::chrono::microseconds(delay));
    std::string content = "";
    File file;
    std::ifstream in;
    in.open(file.getPath() + nameFile);
    if (in.is_open()) getline(in, content);
    else std::cout << "[File::read] Don't open file | path -> " + file.getPath() + nameFile;
    in.close();
    std::cout << content;
    return content;
}).detach();

}

Выводит вот такую надпись, консоль пустая Invalid parameter passed to C runtime function. с++

Answer 1

Написал на коленке для Вас пример как это можно сделать. Просто возьмите примитивы синхронизаций

std::mutex m; 
std::condition_variable cv;

ну или тоже самое можете закрутить синхронизируясь через флаг

std::atomic<bool> isReady(false);

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

Вот пример кода, в Task_2 включите работу с Вашим файлом

#include <chrono> 
#include <condition_variable> 
#include <iostream> 
#include <mutex> 
#include <thread> 
#include <future>

std::condition_variable cv; 

void Task_1() {
    std::mutex mtx_1;
    std::unique_lock<std::mutex> lk(mtx_1); 
    std::cout << "Start task_1!" << std::endl; 
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    // говорим что все готово
    cv.notify_one();
    // ждем ответ от второй задачт
    cv.wait(lk);
    std::cout << "End task_1" << std::endl;
}

void Task_2() {
    std::mutex mtx_2; 
    std::unique_lock<std::mutex> lk(mtx_2); 
    // ждем выполнения
    cv.wait(lk);
    std::cout << "Start task_2!" << std::endl; 
    // работа с файлом
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    std::cout << "End task_2" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(200));
    //скажем обратно что готовы
    cv.notify_one();
}


int main() {
    std::packaged_task<void()> xTask{Task_1}, xTask2{Task_2};
    auto task = xTask.get_future();
    auto task2 = xTask2.get_future();
    std::thread th_1, th_2;
    if (!th_1.joinable()) {
        th_1 = std::thread(std::move(xTask));
    } else {
        th_1.join();
        th_2 = std::thread(std::move(xTask));
    }
    if (!th_2.joinable()) {
        th_2 = std::thread(std::move(xTask2));
    } else {
        th_2.join();
        th_2 = std::thread(std::move(xTask2));
    }
    th_1.join();
    th_2.join();
    try {
        task.wait();
        task.get();
        task2.wait();
        task2.get();
    } catch (std::exception& exc) {
            std::cout << exc.what() << std::endl;
    } catch (...) {
        std::cout << "unknown error ~ !"<< std::endl;
    }
    return 0; 
}
READ ALSO
Ввести порядковый нoмер игральной карты от(0 до 35) и определить масть и достоинство карты(не надо писать 36 if или switch)

Ввести порядковый нoмер игральной карты от(0 до 35) и определить масть и достоинство карты(не надо писать 36 if или switch)

Написала с 36 свитчами,нельзя использовать цикл и тдНужно ограничаться ифами и свитчами,буду рада помощи

110
SendMessage всем окнам с определенным классом

SendMessage всем окнам с определенным классом

Допустим у меня есть 3 запущенных параллельно окна с одним и тем же классомПри клике в одном из них я хочу отсылать с помощью SendMessage информацию...

76
Qt C++ QComboBox Palette - установка цвета (background-color)

Qt C++ QComboBox Palette - установка цвета (background-color)

Как без использования styleSheet изменить background-color QComboBox ? Используя вот такой код:

172