Помогите разобраться, стоит задача: нужно по таймеру вызывать функцию в другом потоке Вот что у меня получается
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. с++
Написал на коленке для Вас пример как это можно сделать. Просто возьмите примитивы синхронизаций
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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Написала с 36 свитчами,нельзя использовать цикл и тдНужно ограничаться ифами и свитчами,буду рада помощи
Допустим у меня есть 3 запущенных параллельно окна с одним и тем же классомПри клике в одном из них я хочу отсылать с помощью SendMessage информацию...
Как без использования styleSheet изменить background-color QComboBox ? Используя вот такой код: