#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::futurestop) { 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;
Комментариев нет:
Отправить комментарий