Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Цикл внутри потока. С++

#cpp #многопоточность #visual_cpp #cpp11


Здравствуйте!

Используеться стандарт С++11, и библиотека .

Есть поток который запускаеться в "фоновом" режиме thread.detach(). внутри етого
потока есть функция setWallpaper(bool status) с бесконечным циклом:

setWallpaper(bool status) {
   if(!status) {
       MessageBox(NULL, status, L"STOP", MB_OK);
   }
   while (status) {
       PVOID path = getPath(rand() % 8 + 1);
       SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE);
       Sleep(min * 1000);
    }
}


Если обратиться к етой функции и передать значение переменной false, то цикл все
еще работает, но должна бы завершиться. Почему так не пойму. Подскажете? Как остановить/завершить
цикл? Спасибо)  
    


Ответы

Ответ 1



Используйте std::future для ожидания и сигнализации о завершении: void setWallpaper(std::future stop) { auto period = std::chrono::seconds(min); do { PVOID path = getPath(rand() % 8 + 1); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE); } while (stop.wait_for(period) != std::future_status::ready); } Запуск: std::promise stop; std::thread(setWallpaper, stop.get_future()).detach(); // Остановка: stop.set_value();

Ответ 2



При втором вызове функции предыдущий вызов не завершается по причине того, что в нем бесконечный цикл.

Ответ 3



Я сделал по своему, вроде работает, мне достаточно :) status и interval в глобальном скоупе. Да, знаю что не правильно, но мне сойдёт) bool status = true; int interval = 1; void startNewThread(int interval) { thread newThread(setWallpaper, &status, interval); newThread.detach(); }; int setWallpaper(bool *status, int interval) { while (true) { if (*status == false) return 0; wstring path = getPath(); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID)path.c_str(), SPIF_UPDATEINIFILE); this_thread::sleep_for(chrono::seconds(interval)); } } При нажатии на кнопку "stop": bool *ptrStatus = &status; *ptrStatus = false;

Комментариев нет:

Отправить комментарий