SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › thread не возвращает данные от созданного окна…
В этой теме 8 ответов, 2 участника, последнее обновление mifon4ik 7 года/лет, 2 мес. назад.
-
АвторСообщения
-
Если кратко, то решил добавить многопоточность. И столкнулся с проблемой того, что передавая цикл Event в отдельном потоке он не возвращает то или иное действие.
Примерно так это выглядит:
Функция с обработкой событий, которая идёт в цикле “пока открыто окно”.
Потом всё как обычно. Создание окна и т.д.
После идёт самый главный цикл – цикл “пока открыто окно”.
И в нём передаю в отдельный поток переменную от RenderWindow. (Так же пробовал сделать поток до основного цикла, который просто идёт бесконечно)Но в итоге всё равно ничего не выходит. Он просто как будто даже не знает о том, что существует поток, который должен обрабатываться. А если делаю тоже самое, например, с обычными переменными типа int, float и далее, далее, далее, то всё в порядке. Он спокойно получает переменную, делает то, что запрошено и возвращает её изменённую.
Подскажите, что не так с RenderWindow, что он не возвращает его в отдельном потоке?
Сформулируй свою проблему более чётко. Лучше с кусками исходного кода.
C++12345678910111213141516171819202122232425262728#include ...using namecpace ...void WinEvent(RenderWindow &window){while(window.isOpen){Event event;while (window.pollEvent(event)){if (event.type == Event::Closed){window.close();}}}}int main(){RenderWindow window(.....);thread thr(WinEvent, ref(window));thr.detach();while(window.isOpen){............}}В данном случае будет окно, которое не поддаётся никаким изменениям и даже закрыть нельзя. И лишь потому, что thread не возвращает данные именно окна. Пробовал тоже самое с другими переменными – всё в норме.
Можно так же вместо цикла событий там пихнуть, например window.draw() и тот же результат будет. Он просто не отобразит.Попробуй использовать вместо RenderWindow::pollEvent RenderWindow::waitEvent. Вот пример кода, который работает у меня: gist.github.com/RazorNd
1. У вас используется функция join и ещё она после основного цикла. А мне надо чтобы она использовалась во время основного цикла. По этому я и использую detach. (Да, у вас работать будет и у меня с моим методом работало, но события не работали, а значит я просто не мог окно закрыть)
2. Это не поможет решению. Мне даже проверять нет смысла, так как это не работает, как я и говорил, и для остальных функций, связанных с окном (Тот же window.draw, например).1) Поток запускается сразу после создания объекта потока. Так что он будет работать параллельно с циклом. join метод синхронизации потоков, который в одном потоке ждет завершения другого. В этом вообще никакой разницы с твоим кодом нет, разве что главный поток ждет завершения работы потока цикла обработки событий.
2) Рисовать ты действительно можешь только в одном потоке. Вот дока. Я же показываю как можно обрабатывать события в одном потоке и рисовать в другом. Я проверил этот код в linux с clang компилятором. Сейчас проверю в windows с visual studi0 2015. Но скорее всего и там оно работает.Понял тебя. Это значит я не совсем верно понял thread. Ну, ладно, с этим разобрались. Но мне всё-таки нужно ещё и рисовать в другом потоке (Например, для экрана загрузки. Для красоты – надо всё-таки). Как мне тогда это реализовать?
Ну или гемороиться со сложно логикой синхронизации потоков либо избавиться от необходимости вызывать draw из разных потоков (изменить архитектуру своей программы).
Ладно, спасибо. Буду разбираться.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.